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

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

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

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

  1. ตั้งค่าโปรเจ็กต์ GCP ต้องใช้โปรเจ็กต์ GCP เพื่อเข้าถึง RTU API
    • ให้สิทธิ์ผู้แก้ไขเข้าถึง food-support@google.com
    • แจ้งหมายเลขโปรเจ็กต์ GCP ให้ Google POC ทราบ โปรเจ็กต์ GCP ต้องเชื่อมโยงกับบัญชี Actions Center เพื่อให้การอัปเดตแบบเรียลไทม์ใช้งานได้
    • เปิดใช้ Maps Booking API:
      • ใน GCP ให้ไปที่ API และบริการ > ไลบรารี
      • ค้นหา "Google Maps Booking API"
        ค้นหา Google Maps Booking API
      • ค้นหาอินสแตนซ์แซนด์บ็อกซ์ ("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 APIs เช่น API การอัปเดตแบบเรียลไทม์

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

  1. เข้าถึงคอนโซล Google Cloud Platform
  2. บัญชีของคุณในศูนย์การดำเนินการมีโปรเจ็กต์ 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 ได้ในศูนย์การดำเนินการในหน้าบัญชีและผู้ใช้ ดังที่แสดงในภาพหน้าจอด้านล่าง

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

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

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

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

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

หากต้องการอัปเดตเอนทิตีในสินค้าคงคลัง ให้ใช้ปลายทางการอัปเดตในคำขอ 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"
  }]
}

ลบเอนทิตี

หากต้องการลบเอนทิตีออกจากพื้นที่โฆษณา ให้ใช้ปลายทางลบในคำขอ 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 ระบบจะรายงานเหตุการณ์เหล่านี้ในหน้าแดชบอร์ดการรายงาน RU ของศูนย์การดำเนินการเท่านั้น

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

โควต้า API

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

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

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

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

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