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

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

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

ระบบจะปฏิเสธคำขอที่ละเมิดขีดจำกัดอัตราโดยแสดงข้อผิดพลาด: RESOURCE_TEMPORARILY_EXHAUSTED

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

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

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

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

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

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

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

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

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

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

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

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

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

การจัดคิว

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

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

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