Google Ads API บังคับใช้การจำกัดอัตราคำขอตามจำนวนคำค้นหาต่อวินาที (QPS) ทั้งในรหัสลูกค้าและโปรเจ็กต์ที่อยู่ในระบบคลาวด์แยกกัน นอกจากคำขอต่อนาที (ซึ่งวัดความถี่ของการเรียก API) แล้ว Google Ads API ยังบังคับใช้ขีดจำกัดการดำเนินการต่อนาที (ซึ่งวัดจำนวนการดำเนินการ API ทั้งหมดในคำขอ) Google Ads API ใช้การค้นหาต่อวินาที (QPS) เพื่อวัด คำขอและกำหนดขีดจำกัด QPS ที่เหมาะสม ดังนั้นขีดจำกัดที่แน่นอนจะแตกต่างกันไป ตามภาระงานโดยรวมของเซิร์ฟเวอร์ในแต่ละช่วงเวลา
วัตถุประสงค์ของการกำหนดขีดจำกัดอัตราคือเพื่อป้องกันไม่ให้ผู้ใช้รายหนึ่งขัดขวางการให้บริการแก่ผู้ใช้รายอื่นด้วยการส่งคำขอจำนวนมากไปยังเซิร์ฟเวอร์ Google Ads API (ไม่ว่าจะโดยเจตนาหรือไม่ก็ตาม)
ระบบจะปฏิเสธคำขอที่ละเมิดขีดจำกัดอัตราและแสดงข้อผิดพลาด:
RESOURCE_TEMPORARILY_EXHAUSTED
คุณสามารถควบคุมแอปและลดผลกระทบจากขีดจำกัดอัตราได้โดยลดจำนวนคำขอและควบคุม QPS จากฝั่งไคลเอ็นต์
มีหลายวิธีที่จะช่วยลดโอกาสในการเกินขีดจำกัดอัตรา การทำความคุ้นเคยกับ แนวคิด Enterprise Integration Patterns (EIP) เช่น การรับส่งข้อความ การส่งซ้ำ และการควบคุม จะช่วยให้คุณสร้างแอปไคลเอ็นต์ที่เสถียรมากขึ้นได้
แนวทางปฏิบัติแนะนำต่อไปนี้เรียงตามความซับซ้อน โดยกลยุทธ์ที่ง่ายกว่าจะอยู่ด้านบน และสถาปัตยกรรมที่ซับซ้อนกว่าแต่มีประสิทธิภาพมากกว่าจะอยู่ด้านล่าง
Exponential Backoff
เมื่อแอปพลิเคชันได้รับข้อผิดพลาด
RESOURCE_TEMPORARILY_EXHAUSTED ให้ใช้นโยบาย
Exponential Backoff พร้อมการสุ่มเวลาหน่วงก่อนที่จะลองคำขอที่ล้มเหลวอีกครั้ง
Exponential Backoff จะเพิ่มเวลารอระหว่างการลองอีกครั้งแบบก้าวหน้า (เช่น รอ 2 วินาที แล้วรอ 4 วินาที แล้วรอ 8 วินาที บวกกับเวลาหน่วงแบบสุ่มเล็กน้อย) ซึ่งจะช่วยให้ภาระงานของเซิร์ฟเวอร์และบัคเก็ตโควต้าฟื้นตัวได้ พร้อมกับป้องกันไม่ให้เกิดการลองอีกครั้งแบบซิงโครไนซ์ในอินสแตนซ์ไคลเอ็นต์
จำกัดงานที่ทำพร้อมกัน
สาเหตุหลักประการหนึ่งที่ทำให้เกิดการเกินขีดจำกัดอัตราคือแอปไคลเอ็นต์สร้างงานแบบขนานมากเกินไป แม้ว่าเราจะไม่ได้จำกัดจำนวนคำขอแบบขนานที่แอปไคลเอ็นต์ส่งได้ แต่การส่งคำขอจำนวนมากอาจทำให้เกิดการเกินขีดจำกัดคำขอต่อวินาที ที่ระดับโปรเจ็กต์ที่อยู่ในระบบคลาวด์ Google ได้
เราขอแนะนำให้กำหนดขีดจำกัดบนที่สมเหตุสมผลสำหรับจำนวนงานทั้งหมดที่ทำพร้อมกันซึ่งจะส่งคำขอ (ในทุกกระบวนการและเครื่อง) และปรับเพิ่มขึ้นเพื่อเพิ่มอัตราการส่งข้อมูลให้เหมาะสมโดยไม่เกินการจำกัดอัตราคำขอ
นอกจากนี้ คุณยังพิจารณาควบคุม QPS จากฝั่งไคลเอ็นต์ได้ด้วย (ดู การควบคุมและการจำกัดอัตราคำขอ)
การจัดกลุ่มคำขอ
พิจารณาจัดกลุ่มการดำเนินการหลายรายการไว้ในคำขอเดียว วิธีนี้เหมาะที่สุดสำหรับการเรียก Mutate สำหรับบริการต่างๆ ตัวอย่างเช่น หากคุณกำลัง
อัปเดตสถานะของอินสแตนซ์ AdGroupAd หลายรายการ คุณ
สามารถเรียก MutateAdGroupAds เพียงครั้งเดียวและส่ง
operations หลายรายการแทนการเรียก
MutateAdGroupAds หนึ่งครั้งสำหรับ
AdGroupAd แต่ละรายการ ดูตัวอย่างเพิ่มเติมได้ในคำแนะนำเกี่ยวกับการดำเนินการแบบกลุ่ม
แม้ว่าการจัดกลุ่มคำขอจะช่วยลดจำนวนการเรียก API ทั้งหมดและลดผลกระทบจาก การจำกัดอัตราคำขอคำขอต่อนาที แต่ก็อาจทำให้เกิดขีดจำกัดอัตราการดำเนินการต่อ นาที หากคุณดำเนินการจำนวนมากกับบัญชีเดียว
การควบคุมและการจำกัดอัตราคำขอ
นอกจากการจำกัดจำนวนเทรดทั้งหมดในแอปพลิเคชันแล้ว คุณยังสามารถใช้การจำกัดอัตราคำขอในฝั่งไคลเอ็นต์ได้ด้วย ซึ่งจะช่วยให้มั่นใจได้ว่าเธรดทั้งหมดในกระบวนการ คลัสเตอร์ หรือทั้ง 2 อย่างจะอยู่ภายใต้การควบคุมของขีดจำกัด QPS ที่เฉพาะเจาะจงจากฝั่งไคลเอ็นต์
ดู Guava RateLimiter หรือใช้ การค้นหาต่อวินาที (QPS)ของคุณเองสำหรับสภาพแวดล้อมแบบคลัสเตอร์ ตัวอย่างเช่น คุณสามารถจัดการโทเค็นในที่เก็บข้อมูลในหน่วยความจำแบบกระจายที่มีเวลาในการตอบสนองต่ำ เช่น Redis หรือ Memcached ซึ่งไคลเอ็นต์แต่ละรายจะได้รับและใช้โทเค็นก่อนที่จะประมวลผลคำขอ หากโทเค็นหมด ไคลเอ็นต์จะรอจนกว่าระบบจะเติมโทเค็นชุดถัดไป
การจัดคิว
คิวข้อความคือโซลูชันสำหรับการกระจายภาระงานการดำเนินการ พร้อมทั้งควบคุมอัตราคำขอและอัตราผู้ใช้ มีตัวเลือกคิวข้อความมากมายให้เลือกใช้ ทั้งแบบโอเพนซอร์สและแบบเป็นกรรมสิทธิ์ และหลายตัวเลือกสามารถทำงานร่วมกับภาษาต่างๆ ได้
เมื่อใช้คิวข้อความ คุณจะมีผู้ผลิตหลายรายที่ส่งข้อความไปยังคิวและผู้ใช้หลายรายที่ประมวลผลข้อความเหล่านั้นได้ คุณสามารถใช้การควบคุมที่ฝั่งผู้ใช้ได้โดยจำกัดจำนวนผู้ใช้ที่ทำพร้อมกัน หรือใช้การจำกัดอัตราคำขอหรือการควบคุมสำหรับผู้ผลิตหรือผู้ใช้
ตัวอย่างเช่น หากผู้ใช้ข้อความพบข้อผิดพลาดขีดจำกัดอัตรา ผู้ใช้รายนั้นสามารถส่งคำขอกลับไปยังคิวโดยมีเวลาหน่วงการลองอีกครั้งที่เป็นมาตรฐาน (โดยใช้ Exponential Backoff) และอัปเดตวงจรความคิดเห็นการจำกัดอัตราที่แชร์เพื่อให้ผู้ใช้ทั้งหมดลดอัตราการประมวลผลโดยอัตโนมัติขณะที่กู้คืนจากข้อผิดพลาด