Antipattern: กำหนดค่าโควต้าที่ไม่มีการเผยแพร่

คุณกำลังดูเอกสารประกอบของ Apigee Edge
ไปที่เอกสารประกอบของ Apigee X
ข้อมูล

Apigee Edge คือความสามารถในการกำหนดจำนวนคำขอที่อนุญาตที่ส่งไปยังพร็อกซี API ในช่วงเวลาหนึ่งโดยใช้นโยบายโควต้า

ลายป้องกัน

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

เราจะอธิบายเรื่องนี้โดยใช้ตัวอย่าง ลองใช้นโยบายโควต้าต่อไปนี้สำหรับพร็อกซี API

<!-- /antipatterns/examples/1-6.xml -->
<Quota name="CheckTrafficQuota">
  <Interval>1</Interval>
  <TimeUnit>hour</TimeUnit>
  <Allow count="100"/>
</Quota>

การกำหนดค่าข้างต้นควรอนุญาตให้มีคำขอทั้งหมด 100 รายการต่อชั่วโมง

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

ในภาพด้านบน:

  • นโยบายโควต้าได้รับการกำหนดค่าให้อนุญาตคำขอ 100 รายการต่อชั่วโมง
  • คำขอที่ส่งไปยังพร็อกซี API กำลังดำเนินการโดยผู้ประมวลผลข้อความ 2 ราย
  • ผู้ประมวลผลข้อความแต่ละรายจะเก็บรักษาตัวแปรจำนวนโควต้าของตัวเอง ได้แก่ quota_count_mp1 และ quota_count_mp2 เพื่อติดตามจำนวนคำขอที่กำลังประมวลผล
  • ดังนั้น ผู้ประมวลผลข้อความแต่ละรายจะอนุญาตคำขอ API ได้ 100 รายการแยกกัน ผลกระทบโดยรวมคือระบบจะประมวลผลคำขอทั้งหมด 200 รายการแทนที่จะเป็น 100 คำขอ

มีอิทธิพล

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

เซิร์ฟเวอร์แบ็กเอนด์จะทำสิ่งต่อไปนี้ได้

  • ได้รับความเครียดเนื่องจากการเข้าชมที่เข้ามาใหม่มากกว่าที่คาดไว้
  • ไม่ตอบสนองคำขอ API ที่ใหม่กว่าซึ่งทําให้เกิดข้อผิดพลาด 503

แนวทางปฏิบัติแนะนำ

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

<!-- /antipatterns/examples/1-7.xml -->
<Quota name="CheckTrafficQuota">
  <Interval>1</Interval>
  <TimeUnit>hour</TimeUnit>
  <Distributed>true</Distributed>
  <Allow count="100"/>
</Quota>