ขีดจำกัดอัตรา

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

วัตถุประสงค์ของการจำกัดอัตราคำขอคือเพื่อป้องกันไม่ให้ผู้ใช้รายหนึ่งรบกวนการให้บริการแก่ผู้ใช้รายอื่นๆ โดยการส่งคำขอจำนวนมากไปยังเซิร์ฟเวอร์ Google Ads API (ไม่ว่าจะโดยตั้งใจหรือไม่ตั้งใจก็ตาม)

คำขอที่ละเมิดการจำกัดอัตราคำขอจะถูกปฏิเสธพร้อมข้อผิดพลาดต่อไปนี้ RESOURCE_TEMPORARILY_EXHAUSTED

คุณสามารถควบคุมแอปและลดการจำกัดอัตราคำขอได้โดยการลดจำนวนคำขอและจำกัด QPS จากฝั่งไคลเอ็นต์อย่างสม่ำเสมอ

คุณลดโอกาสที่จะเกินขีดจำกัดอัตราได้หลายวิธี การทำความคุ้นเคยกับแนวคิด Enterprise Integration Patterns (EIP) เช่น การรับส่งข้อความ การนำส่งซ้ำ และการควบคุมปริมาณ จะช่วยให้คุณสร้างแอปไคลเอ็นต์ที่มีประสิทธิภาพมากขึ้นได้

แนวทางปฏิบัติแนะนำต่อไปนี้เรียงลำดับตามความซับซ้อน โดยกลยุทธ์ที่ง่ายกว่าจะอยู่ด้านบน และสถาปัตยกรรมที่มีประสิทธิภาพแต่ซับซ้อนกว่าจะอยู่ด้านล่าง

Exponential Backoff

เมื่อแอปพลิเคชันได้รับข้อผิดพลาด RESOURCE_TEMPORARILY_EXHAUSTED ให้ใช้นโยบาย Exponential Backoff ที่มี Jitter แบบสุ่มก่อนลองส่งคำขอที่ล้มเหลวอีกครั้ง Exponential Backoff จะเพิ่มเวลารอระหว่างการลองใหม่ (เช่น รอ 2 วินาที จากนั้น 4 วินาที จากนั้น 8 วินาที บวกกับความล่าช้าแบบสุ่มเล็กน้อย) ซึ่งช่วยให้โหลดเซิร์ฟเวอร์และที่เก็บโควต้ากู้คืนได้ ขณะเดียวกันก็ป้องกันไม่ให้เกิดการลองใหม่พร้อมกันในอินสแตนซ์ไคลเอ็นต์

จำกัดงานที่ทำพร้อมกัน

สาเหตุของปัญหาหนึ่งของการจำกัดอัตราคำขอเกินขีดจำกัดคือแอปไคลเอ็นต์สร้างงานที่ทำพร้อมกันมากเกินไป แม้ว่าเราจะไม่จำกัดจำนวนคำขอพร้อมกันที่แอปไคลเอ็นต์มีได้ แต่จำนวนนี้อาจเกินขีดจำกัดคำขอต่อวินาทีที่ระดับโปรเจ็กต์ที่อยู่ในระบบคลาวด์ Google Cloud

เราขอแนะนำให้ตั้งค่าขอบเขตบนที่เหมาะสมสำหรับจำนวนงานที่เกิดขึ้นพร้อมกันทั้งหมดซึ่งจะส่งคำขอ (ในกระบวนการและเครื่องทั้งหมด) และปรับเพิ่มเพื่อเพิ่มประสิทธิภาพอัตราการส่งข้อมูลโดยไม่เกินการจำกัดอัตราคำขอ

นอกจากนี้ คุณยังพิจารณาควบคุม QPS จากฝั่งไคลเอ็นต์ได้ด้วย (ดูหัวข้อการควบคุมและการจำกัดอัตราคำขอ)

การจัดกลุ่มคำขอ

ลองจัดกลุ่มการดำเนินการหลายรายการไว้ในคำขอเดียว ซึ่งมักใช้กับการโทร Mutate สำหรับบริการต่างๆ เช่น หากคุณอัปเดตสถานะของ AdGroupAd หลายรายการ คุณสามารถเรียกใช้ MutateAdGroupAds เพียงครั้งเดียวและส่ง operations หลายรายการแทนการเรียกใช้ MutateAdGroupAds เพียงครั้งเดียวสำหรับ AdGroupAd แต่ละรายการ ดูตัวอย่างเพิ่มเติมได้ในคำแนะนำเกี่ยวกับการดำเนินการแบบกลุ่ม

แม้ว่าการจัดกลุ่มคำขอจะช่วยลดจำนวนการเรียก API ทั้งหมดและลดการจำกัดอัตราคำขอคำขอต่อนาที แต่ก็อาจทำให้เกิดการจำกัดอัตราการดำเนินการต่อนาทีหากคุณดำเนินการจำนวนมากกับบัญชีเดียว

การควบคุมปริมาณและการจำกัดอัตราคำขอ

นอกจากการจำกัดจำนวนชุดข้อความทั้งหมดในแอปพลิเคชันแล้ว คุณยังใช้ตัวจำกัดอัตราคำขอฝั่งไคลเอ็นต์ได้ด้วย วิธีนี้ช่วยให้มั่นใจได้ว่าชุดข้อความทั้งหมดในกระบวนการ คลัสเตอร์ หรือทั้ง 2 อย่างจะอยู่ภายใต้ขีดจำกัด QPS ที่เฉพาะเจาะจงจากฝั่งไคลเอ็นต์

ดู Guava RateLimiter หรือใช้อัลกอริทึม Bucket โทเค็นของคุณเองสำหรับสภาพแวดล้อมแบบคลัสเตอร์ ตัวอย่างเช่น คุณสามารถจัดการโทเค็นในพื้นที่เก็บข้อมูลในหน่วยความจำแบบกระจายที่มีเวลาในการตอบสนองต่ำ เช่น Redis หรือ Memcached ซึ่งไคลเอ็นต์แต่ละรายจะได้รับและใช้โทเค็นก่อนที่จะประมวลผลคำขอ หากโทเค็นหมด ไคลเอ็นต์จะรอจนกว่าจะมีการเติมโทเค็นชุดถัดไป

การจัดคิว

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

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

ตัวอย่างเช่น หากผู้ใช้ข้อความพบข้อผิดพลาดเกี่ยวกับการจำกัดอัตราคำขอ ผู้ใช้รายนั้นสามารถส่งคำขอกลับไปยังคิวโดยใช้ความล่าช้าในการลองใหม่ที่ได้มาตรฐาน (โดยใช้ Exponential Backoff) และอัปเดตรายงานความคิดเห็นเกี่ยวกับการจำกัดอัตราคำขอที่แชร์ เพื่อให้ผู้ใช้ทั้งหมดลดอัตราการประมวลผลโดยอัตโนมัติขณะกู้คืนจากข้อผิดพลาด