การอัปเดตแบบเรียลไทม์

ข้อมูลอัปเดตแบบเรียลไทม์

RTU มีไว้สำหรับการอัปเดตที่คุณคาดการณ์ไม่ได้เป็นหลัก เช่น การปิดฉุกเฉิน หรือข้อมูลเมตาที่เปลี่ยนแปลงเป็นระยะๆ (เช่น ETA) หากไม่จำเป็นต้องแสดงการเปลี่ยนแปลงทันที คุณสามารถใช้การส่งผ่านข้อมูลฟีดแบบเป็นชุดแทนได้ การอัปเดตแบบเรียลไทม์จะได้รับการประมวลผลภายในไม่เกิน 5 นาที

การตั้งค่า Google Cloud Platform

  1. ตั้งค่าโปรเจ็กต์ GCP คุณต้องมีโปรเจ็กต์ GCP เพื่อเข้าถึง RTU API
    • ให้สิทธิ์เข้าถึงระดับเอดิเตอร์แก่ food-support@google.com
    • แจ้งหมายเลขโปรเจ็กต์ GCP ให้ POC ของ Google ทราบ โปรเจ็กต์ GCP ต้องเชื่อมโยงกับบัญชี Actions Center เพื่อให้อัปเดตแบบเรียลไทม์ทำงานได้
    • เปิดใช้ Maps Booking API:
      • ใน GCP ให้ไปที่ API และบริการ > ไลบรารี
      • ค้นหา "Google Maps Booking API"
        ค้นหา Google Maps Booking API
      • ค้นหาอินสแตนซ์ Sandbox ("Google Maps Booking API (Dev)") แล้วคลิกเปิดใช้
      • ค้นหาอินสแตนซ์เวอร์ชันที่ใช้งานจริง ("Google Maps Booking API") แล้วคลิกเปิดใช้
        เปิดใช้ Google Maps Booking API
      • สร้างบัญชีบริการที่มีบทบาทผู้แก้ไขในโปรเจ็กต์ GCP ดูรายละเอียดเพิ่มเติมได้ที่การตั้งค่าบัญชีบริการ
      • ตรวจสอบว่าคุณอัปโหลดฟีดกลุ่มไปยังสภาพแวดล้อมที่คุณกำลังทำงานเกี่ยวกับการอัปเดตแบบเรียลไทม์
      • สำหรับการตรวจสอบสิทธิ์ API เราขอแนะนำให้ติดตั้งไลบรารีของไคลเอ็นต์ Google ในภาษาที่คุณเลือก ใช้ "https://www.googleapis.com/auth/mapsbooking" เป็นขอบเขต OAuth ตัวอย่างโค้ดที่รวมไว้ด้านล่างใช้ไลบรารีเหล่านี้ หรือคุณจะต้องจัดการการแลกเปลี่ยนโทเค็นด้วยตนเองตามที่อธิบายไว้ในการใช้ OAuth 2.0 เพื่อเข้าถึง Google APIs

การตั้งค่าบัญชีบริการ

คุณต้องมีบัญชีบริการเพื่อส่งคำขอ HTTPS ที่ตรวจสอบสิทธิ์แล้วไปยัง Google API เช่น API การอัปเดตแบบเรียลไทม์

หากต้องการตั้งค่าบัญชีบริการ ให้ทำดังนี้

  1. เข้าถึงคอนโซล Google Cloud Platform
  2. บัญชีของคุณใน Actions Center ยังมีโปรเจ็กต์ Google Cloud ที่เชื่อมโยงอยู่ด้วย เลือกโปรเจ็กต์นั้น หากยังไม่ได้เลือก
  3. คลิกบัญชีบริการในเมนูด้านซ้าย
  4. คลิกสร้างบัญชีบริการ
  5. ตั้งชื่อบัญชีบริการ แล้วคลิกสร้าง
  6. สำหรับเลือกบทบาท ให้เลือกโปรเจ็กต์ > ผู้แก้ไข
  7. คลิกต่อไป
  8. ไม่บังคับ: เพิ่มผู้ใช้เพื่อให้สิทธิ์เข้าถึงบัญชีบริการ แล้วคลิกเสร็จสิ้น
  9. คลิกเพิ่มเติม > สร้างคีย์สำหรับบัญชีบริการที่คุณเพิ่งสร้าง
  10. เลือก JSON เป็นรูปแบบ แล้วคลิกสร้าง
  11. หลังจากสร้างคู่คีย์สาธารณะ/ส่วนตัวใหม่แล้ว ให้ดาวน์โหลดลงในเครื่อง

การทำงานกับ API

API การอัปเดตแบบเรียลไทม์รองรับการดำเนินการ 2 ประเภท ได้แก่ อัปเดตและลบ ไม่รองรับการเพิ่มเอนทิตีใหม่ผ่าน API การอัปเดตแบบเรียลไทม์ คุณจัดกลุ่มการอัปเดตแบบเรียลไทม์ได้หากรวมการอัปเดตหลายรายการไว้ในคำขอ API เดียว คุณอัปเดตแบบเป็นกลุ่มได้สูงสุด 1,000 รายการในการเรียก API ครั้งเดียว เราขอแนะนำให้ใช้แนวทางที่อิงตามทริกเกอร์เพื่อส่งการอัปเดตผ่าน RTU (เช่น เมื่อข้อมูลในระบบมีการเปลี่ยนแปลง ให้ทริกเกอร์การอัปเดตแบบเรียลไทม์ไปยัง Google) แทนแนวทางที่อิงตามความถี่ (เช่น ทุกๆ X นาที ให้สแกนระบบเพื่อหาการเปลี่ยนแปลง) หากเป็นไปได้

API การอัปเดตแบบเรียลไทม์จะทำงานทั้งในสภาพแวดล้อมแซนด์บ็อกซ์และสภาพแวดล้อมที่ใช้งานจริง ใช้สภาพแวดล้อมแซนด์บ็อกซ์เพื่อทดสอบคำขอ API และใช้สภาพแวดล้อมการใช้งานจริงเพื่ออัปเดตเนื้อหาที่ผู้ใช้การสั่งซื้อแบบครบวงจรมองเห็น

  • แซนด์บ็อกซ์ - partnerdev-mapsbooking.googleapis.com
  • การผลิต - mapsbooking.googleapis.com

ปลายทาง

API การอัปเดตแบบเรียลไทม์แสดงปลายทาง 2 รายการเพื่อจัดการคำขอขาเข้าสำหรับการอัปเดตพื้นที่โฆษณา

  • อัปเดต - /v1alpha/inventory/partners/PARTNER_ID/feeds/google.food_service/record:batchPush
  • ลบ - /v1alpha/inventory/partners/PARTNER_ID/feeds/google.food_service/record:batchDelete

คุณดูพารามิเตอร์ PARTNER_ID ได้ใน Actions Center ที่หน้าบัญชีและผู้ใช้ ดังที่แสดงในภาพหน้าจอด้านล่าง

รหัสพาร์ทเนอร์ในพอร์ทัลของพาร์ทเนอร์

เมื่อใช้ 10000001 เป็นค่าของ PARTNER_ID เป็นตัวอย่างจากภาพหน้าจอด้านบน URL ที่สมบูรณ์สำหรับการส่งคำขอ API ใน Sandbox และการใช้งานจริงจะมีลักษณะดังตัวอย่างด้านล่าง

การอัปเดตแซนด์บ็อกซ์

https://partnerdev-mapsbooking.googleapis.com/v1alpha/inventory/partners/10000001/feeds/google.food_service/record:batchPush

ลบในแซนด์บ็อกซ์

https://partnerdev-mapsbooking.googleapis.com/v1alpha/inventory/partners/10000001/feeds/google.food_service/record:batchDelete

ข้อมูลอัปเดตเกี่ยวกับเวอร์ชันที่ใช้งานจริง

https://mapsbooking.googleapis.com/v1alpha/inventory/partners/10000001/feeds/google.food_service/record:batchPush

ลบเวอร์ชันที่ใช้งานจริง

https://mapsbooking.googleapis.com/v1alpha/inventory/partners/10000001/feeds/google.food_service/record:batchDelete

การอัปเดตเอนทิตี

หากต้องการอัปเดตเอนทิตีในสินค้าคงคลัง ให้ใช้ปลายทาง update ในคำขอ HTTP POST คำขอ POST แต่ละรายการต้องมีพารามิเตอร์ 10000001 พร้อมกับเพย์โหลด JSON ที่มีเอนทิตีที่คุณต้องการอัปเดต

หมายเหตุ: ตรวจสอบว่าฟีดข้อมูลรายวันมีการเปลี่ยนแปลงที่ส่งผ่าน API การอัปเดตแบบเรียลไทม์ด้วย มิฉะนั้นข้อมูลอาจล้าสมัยหรือไม่ถูกต้อง

เพย์โหลดคำขออัปเดต

เนื้อหาของคำขอคือออบเจ็กต์ JSON ที่มีรายการระเบียน แต่ละระเบียนจะสอดคล้องกับเอนทิตีที่กำลังอัปเดต ซึ่งประกอบด้วยฟิลด์ proto_record และ generation_timestamp ที่ระบุเวลาของการอัปเดตเอนทิตี

  {
    "records": [
      {
        "proto_record":"ServiceData PROTO",
        "generation_timestamp":"UPDATE_TIMESTAMP"
      }
    ]
  }
  • ServiceData PROTO: การแปล proto หรือ JSON ของเอนทิตี ServiceData ที่คุณกำลังอัปเดต
  • UPDATE_TIMESTAMP: อย่าลืมใส่การประทับเวลาของตอนที่สร้างเอนทิตีในระบบแบ็กเอนด์ หากไม่ได้ระบุช่องนี้ ระบบจะตั้งค่าเป็นเวลาที่ Google ได้รับคำขอ เมื่ออัปเดตเอนทิตีผ่านคำขอ batchPush ระบบจะใช้ฟิลด์ generation_timestamp สำหรับการควบคุมเวอร์ชันของเอนทิตี ดูรูปแบบที่คาดไว้ของค่าเวลาในสคีมาสินค้าคงคลังเชิงสัมพันธ์
  • เนื้อหาของเพย์โหลดต้องมีขนาดไม่เกิน 5 MB
  • นำช่องว่างออกเพื่อลดขนาด
  • batchPush คำขอหนึ่งๆ มีการอัปเดตได้สูงสุด 1,000 รายการ

ตัวอย่าง

อัปเดตเวลาถึงโดยประมาณ

สมมติว่าคุณจำเป็นต้องอัปเดตเวลาที่คาดคะเนของการนำส่งจาก 30-60 นาทีเป็น 60-90 นาทีอย่างเร่งด่วน การอัปเดตต้องมี JSON สำหรับเอนทิตีบริการทั้งหมด

ลองพิจารณาเอนทิตีบริการที่มีลักษณะดังนี้

{
	"service": {
		"service_id": "service/entity002",
		"service_type": "DELIVERY",
		"parent_entity_id": "entity002",
		"lead_time": {
			"min_lead_time_duration": "600s",
			"max_lead_time_duration": "1800s"
		},
		"action_link_id": "delivery_link/entity002"
	}
}

การอัปเดตแบบเรียลไทม์โดยใช้ HTTP POST มีดังนี้ (ระบบจะจัดรูปแบบเนื้อหาคำขอเพื่อให้อ่านง่าย)

POST v1alpha/inventory/partners/PARTNER_ID/feeds/google.food_service/record:batchPush
Host: mapsbooking.googleapis.com
Content-Type: application/json
{
  "records": [{
    "proto_record": {
      "@type": "type.googleapis.com/food.ordering.service.v1.ServiceData",
      "service" : {
        "service_id" : "23456/delivery",
        "service_type" : "DELIVERY",
        "parent_entity_id" : "23456",
        "disabled" : "false",
        "action_link_id": "delivery_link/entity002",
        "lead_time" : {
          "min_lead_time_duration" : {
            "seconds": "3600"
          },
          "max_lead_time_duration" : {
            "seconds": "5400"
          }
        }
      }
    },
    "generation_timestamp": "2023-09-13T17:11:10.750Z"
  }]
}

อัปเดตเอนทิตีหลายรายการ

หากต้องการอัปเดตเอนทิตีร้านอาหารหลายรายการในการเรียก API ครั้งเดียว ให้รวมระเบียนหลายรายการไว้ในช่อง proto_record ของเนื้อหาคำขอ

POST v1alpha/inventory/partners/PARTNER_ID/feeds/google.food_service/record:batchPush
Host: mapsbooking.googleapis.com
Content-Type: application/json
{
  "records": [{
    "proto_record": {
      "@type": "type.googleapis.com/food.ordering.service.v1.ServiceData",
      "service" : {
        "service_id" : "23456/delivery",
        "service_type" : "DELIVERY",
        "parent_entity_id" : "23456",
        "disabled" : "false",
        "action_link_id": "delivery_link/entity002",
        "lead_time" : {
          "min_lead_time_duration" : {
            "seconds": "1800"
          },
          "max_lead_time_duration" : {
            "seconds": "3600"
          }
        }
      }
    },
    "generation_timestamp": "2023-09-13T17:11:10.750Z"
  },
  {
    "proto_record": {
      "@type": "type.googleapis.com/food.ordering.service.v1.ServiceData",
      "fee" : {
        "fee_id" : "12345/delivery_fee",
        "fee_type" : "DELIVERY",
        "fixed_amount" : {
          "currency_code" : "USD",
          "units" : "10",
          "nanos" : "0"
        },
        "service_ids": ["service/entity002"]
      }
    },
    "generation_timestamp" : "2023-09-13T17:11:10.750Z"
  }]
}

ลบเอนทิตี

หากต้องการลบเอนทิตีออกจากพื้นที่โฆษณา ให้ใช้ปลายทาง DELETE ในคำขอ HTTP POST คำขอ POST แต่ละรายการต้องมีพารามิเตอร์ PARTNER_ID พร้อมกับเพย์โหลด JSON ซึ่งมีตัวระบุของเอนทิตีที่คุณต้องการลบ

หมายเหตุ: ตรวจสอบว่าฟีดข้อมูลรายวันมีการเปลี่ยนแปลงที่ส่งผ่าน API การอัปเดตแบบเรียลไทม์ด้วย มิฉะนั้น การส่งผ่านข้อมูลแบบเป็นชุดรายวันจะเขียนทับการเปลี่ยนแปลงแบบเรียลไทม์

POST v1alpha/inventory/partners/PARTNER_ID/feeds/google.food_service/record:batchDelete
Host: mapsbooking.googleapis.com
Content-Type: application/json
{
  "records": [{
    "proto_record": {
      "@type": "type.googleapis.com/food.ordering.service.v1.ServiceData",
      "service" : {
        "service_id" : "23456/delivery"
      }
    },
    "delete_time": "2023-09-13T17:11:10.750Z"
  },
  {
    "proto_record": {
      "@type": "type.googleapis.com/food.ordering.service.v1.ServiceData",
      "fee" : {
        "fee_id" : "12345/delivery_fee"
     }
  },
  "delete_time" : "2023-09-13T17:11:10.750Z"
  }]
}

การเพิ่มเอนทิตี

อย่าใช้การอัปเดตแบบเรียลไทม์เพื่อเพิ่มเอนทิตีใหม่ เนื่องจากอาจทำให้ข้อมูลไม่สอดคล้องกัน โปรดใช้ฟีดกลุ่มแทน

รหัสการตรวจสอบและความถูกต้องและการตอบกลับของ API

การตรวจสอบการเรียก API การอัปเดตแบบเรียลไทม์มี 2 ประเภท ดังนี้

  • ระดับคำขอ - การตรวจสอบเหล่านี้จะตรวจสอบว่าเพย์โหลดเป็นไปตามสคีมา และทุก proto_record มีฟิลด์ id และ type การตรวจสอบเหล่านี้เป็นแบบซิงโครนัสและระบบจะแสดงผลลัพธ์ในเนื้อหาการตอบกลับของ API รหัสการตอบกลับ 200 และเนื้อหา JSON ว่าง {} หมายความว่าการตรวจสอบเหล่านี้ผ่าน และระบบได้จัดคิวเอนทิตีในคำขอนั้นเพื่อประมวลผลแล้ว รหัสการตอบกลับที่ไม่ใช่ 200 หมายความว่าการตรวจสอบอย่างน้อย 1 รายการเหล่านี้ล้มเหลว และคำขอทั้งหมดถูกปฏิเสธ (รวมถึงเอนทิตีทั้งหมดในเพย์โหลด) ตัวอย่างเช่น หาก proto_record ไม่มี @type ระบบจะแสดงผลการตอบกลับข้อผิดพลาดต่อไปนี้
  {
      "error": {
        "code": 400,
    "message": "Record:{...}",
    "status": "INVALID_ARGUMENT",
    "details": [
      {
        "@type": "type.googleapis.com/google.rpc.DebugInfo",
        "detail": "[ORIGINAL ERROR] generic::invalid_argument: Failed to parse one or more rtu records. Record:... The entity type could not be extracted from the entity value." 
      }
    ]
  }
  • ระดับเอนทิตี: ระบบจะตรวจสอบความถูกต้องของแต่ละเอนทิตี (proto_record) ในเพย์โหลดกับสคีมา ระบบจะไม่รายงานปัญหาที่พบในระยะการตรวจสอบนี้ในการตอบกลับของ API โดยจะรายงานในแดชบอร์ดการรายงาน RTU ของศูนย์การดำเนินการเท่านั้น

หมายเหตุ: โค้ดการตอบกลับ 200 ไม่ได้หมายความว่าระบบจะส่งผ่านข้อมูลเอนทิตีทั้งหมดได้สำเร็จ

โควต้า API

การอัปเดต API แบบเรียลไทม์มีโควต้าคำขอ 1,500 รายการทุกๆ 60 วินาที หรือเฉลี่ย 25 คำขอต่อวินาที เมื่อใช้โควต้าเกิน Google จะตอบกลับด้วยข้อความแสดงข้อผิดพลาดต่อไปนี้

{
  "error": {
    "code": 429,
    "message": "Insufficient tokens for quota ...",
    "status": "RESOURCE_EXHAUSTED",
    "details": [...]
  }
}

หากต้องการจัดการปัญหานี้ ให้ลองโทรอีกครั้งโดยเว้นระยะห่างที่เพิ่มขึ้นแบบทวีคูณจนกว่าจะสำเร็จ หากคุณใช้โควต้าจนหมดเป็นประจำ ให้พิจารณารวมเอนทิตีเพิ่มเติมไว้ในคำขอ API เดียว คุณใส่เอนทิตีได้สูงสุด 1,000 รายการในการเรียก API ครั้งเดียว

เวลาในการประมวลผลและการอัปเดตแบบเรียลไทม์

ระบบจะประมวลผลเอนทิตีที่อัปเดตผ่านการอัปเดตแบบเรียลไทม์ภายใน 5 นาที