คุณกำลังดูเอกสารประกอบ Apigee Edge
ไปที่
เอกสารประกอบเกี่ยวกับ Apigee X. ข้อมูล
Apigee Edge ให้คุณกำหนดค่าจำนวนคำขอที่ได้รับอนุญาตสำหรับพร็อกซี API สำหรับ ระยะเวลาที่เจาะจงโดยใช้นโยบายโควต้า
ลาย Antipattern
หากใช้นโยบายโควต้าซ้ำ ระบบจะลดจำนวนตัวนับโควต้าในแต่ละครั้งที่ ระบบจะบังคับใช้นโยบายโควต้าไม่ว่าจะใช้งานที่ใด กล่าวคือ หากนโยบายโควต้าคือ นำมาใช้ซ้ำ:
- ภายในขั้นตอนเดียวกันหรือหลายขั้นตอนของพร็อกซี API
- ในปลายทางเป้าหมายที่ต่างกันของพร็อกซี API
จากนั้นตัวนับโควต้าจะลดลงทุกครั้งที่ดำเนินการ และสุดท้ายจะมี ข้อผิดพลาดการละเมิดโควต้าเกิดขึ้นก่อนเวลาที่คาดไว้มากสำหรับช่วงเวลาที่ระบุ
ลองใช้ตัวอย่างต่อไปนี้เพื่ออธิบายวิธีการทำงาน
พร็อกซี API
สมมติว่าคุณมีพร็อกซี API ชื่อ “TestTargetServerBid” ซึ่งกำหนดเส้นทางการรับส่งข้อมูลไปยัง เซิร์ฟเวอร์เป้าหมายที่ต่างกันตามเส้นทางทรัพยากร และเราจะจำกัดปริมาณการรับส่งข้อมูลของ API เป็น 10 คำขอต่อนาทีสำหรับเซิร์ฟเวอร์เป้าหมายแต่ละเซิร์ฟเวอร์เหล่านี้ นี่คือตารางที่แสดง สถานการณ์:
เส้นทางทรัพยากร | เซิร์ฟเวอร์เป้าหมาย | โควต้า |
---|---|---|
/target-us |
target-US.somedomain.com |
10 คำขอต่อนาที |
/target-eu |
target-EU.somedomain.com |
10 คำขอต่อนาที |
นโยบายโควต้า
เนื่องจากโควต้าการรับส่งข้อมูลของเซิร์ฟเวอร์เป้าหมายทั้งสองนั้นเท่ากัน เราจึงกำหนดนโยบายโควต้ารายการเดียว ชื่อ "Bid-Minute-Target-Server" ตามที่แสดงด้านล่าง
<!-- /antipatterns/examples/1-8.xml --> <Quota name="Quota-Minute-Target-Server"> <Interval>1</Interval> <TimeUnit>minute</TimeUnit> <Distributed>true</Distributed> <Allow count="10"/> </Quota>
ปลายทางเป้าหมาย
มาใช้นโยบายโควต้า "โควต้านาที-เซิร์ฟเวอร์เป้าหมาย" ในขั้นตอนก่อนหน้าของเป้าหมาย "กำหนดเป้าหมายไปยังสหรัฐอเมริกา":
<!-- /antipatterns/examples/1-9.xml --> <TargetEndpoint name="Target-US"> <PreFlow name="PreFlow"> <Request> <Step> <Name>Quota-Minute-Target-Server</Name> </Step> </Request> </PreFlow> <HTTPTargetConnection> <URL>http://target-us.somedomain.com</URL> </HTTPTargetConnection> </TargetEndpoint>
และนำนโยบายโควต้า "โควต้านาที เซิร์ฟเวอร์เป้าหมาย" เดียวกันมาใช้ซ้ำในขั้นตอนก่อนหน้าของเป้าหมายอื่น ปลายทาง “Target-EU” ด้วยเช่นกัน
<!-- /antipatterns/examples/1-10.xml --> <TargetEndpoint name="Target-EU"> <PreFlow name="PreFlow"> <Request> <Step> <Name>Quota-Minute-Target-Server</Name> </Step> </Request> <Response/> </PreFlow> <HTTPTargetConnection> <URL>http://target-us.somedomain.com</URL> </HTTPTargetConnection> </TargetEndpoint>
รูปแบบการเข้าชมขาเข้า
สมมติว่าเราได้รับคำขอ API ทั้งหมด 10 รายการสำหรับพร็อกซี API นี้ ภายใน 30 วินาทีแรกใน รูปแบบต่อไปนี้
เส้นทางทรัพยากร | /target-us |
/target-eu |
ทั้งหมด |
---|---|---|---|
คำขอ # รายการ | 4 | 6 | 10 |
หลังจากนี้ไม่นาน เราได้รับคำขอ API รายการที่ 11 ที่มีเส้นทางทรัพยากรเป็น /target-us
สมมติว่าหลังผ่านไป 32 วินาที
เราคาดว่าคำขอจะผ่านเสร็จสมบูรณ์ โดยสมมติว่าเรายังมีคำขอ API อีก 6 รายการ
ปลายทาง target-us
ตามโควต้าที่อนุญาต
อย่างไรก็ตาม ในความเป็นจริง เราจะได้รับ Quota violation error
เหตุผล: เนื่องจากเราใช้นโยบายโควต้าเดียวกันในปลายทางเป้าหมายทั้ง 2 รายการ ตัวนับโควต้าเดียวใช้เพื่อติดตามคำขอ API ที่เข้าถึงปลายทางเป้าหมายทั้ง 2 รายการ ดังนั้น ใช้โควต้าคำขอ 10 รายการต่อนาทีรวมกันแทนที่จะใช้สำหรับเป้าหมายแต่ละรายการ ปลายทาง
ผลกระทบ
รูปแบบที่เปลี่ยนแปลงไปนี้อาจส่งผลให้ความคาดหวังซึ่งไม่ตรงกันโดยพื้นฐาน ทำให้เกิดการรับรู้ ว่าขีดจำกัดโควต้านั้นหมดลงล่วงหน้าแล้ว
แนวทางปฏิบัติแนะนำ
- ใช้องค์ประกอบ
<Class>
หรือ<Identifier>
เพื่อให้แน่ใจว่า ตัวนับที่ไม่ซ้ำกันจะได้รับการจัดการโดยการกำหนดนโยบายโควต้าเดียว ลองกำหนดนโยบายโควต้าใหม่ "Bid-Minute-Target-Server" ที่เราเพิ่งอธิบายในส่วนก่อนหน้านี้โดยใช้ส่วนหัวtarget_id
เป็น<Identifier>
สำหรับ ตามที่แสดงด้านล่าง:<!-- /antipatterns/examples/1-11.xml --> <Quota name="Quota-Minute-Target-Server"> <Interval>1</Interval> <TimeUnit>minute</TimeUnit> <Allow count="10"/> <Identifier ref="request.header.target_id"/> <Distributed>true</Distributed> </Quota>
- เราจะใช้นโยบายโควต้านี้ต่อไปทั้งในปลายทางเป้าหมาย "Target-US" และ "กำหนดเป้าหมาย-สหภาพยุโรป" เหมือนเดิม
- คราวนี้สมมติว่าส่วนหัว
target_id
มีค่า "US" ระบบจะส่งคำขอไปยัง อุปกรณ์ปลายทางเป้าหมาย "Target-US" - ในทำนองเดียวกัน หากส่วนหัว
target_id
มีค่า "EU" ระบบจะส่งคำขอไปยังเป้าหมาย ปลายทาง “Target-EU” - ดังนั้นแม้ว่าเราจะใช้นโยบายโควต้าเดียวกันในปลายทางเป้าหมายทั้ง 2 รายการ แต่ตัวนับโควต้าจะแยกกัน
จะคงไว้ตามค่า
<Identifier>
- ดังนั้นด้วยการใช้องค์ประกอบ
<Identifier>
เราจึงยืนยันได้ว่าปลายทางเป้าหมายแต่ละรายการ ได้รับโควต้าคำขอ 10 รายการ
- ใช้นโยบายโควต้าแยกกันในแต่ละโฟลว์/ปลายทางเป้าหมาย/พร็อกซี API เพื่อให้แน่ใจว่าคุณ
ได้รับคำขอ API ตามจำนวนที่อนุญาตเสมอ คราวนี้เรามาดูตัวอย่างเดียวกับที่ใช้ใน
ด้านบนเพื่อดูว่าเราจะบรรลุโควต้า 10 คำขอที่อนุญาตสำหรับแต่ละเป้าหมายได้อย่างไร
ปลายทาง
- กำหนดนโยบายโควต้าแยกกันสำหรับปลายทางเป้าหมาย "Target-US" อย่างละ 1 นโยบาย
"เป้าหมาย - สหภาพยุโรป"
นโยบายโควต้าสำหรับปลายทางเป้าหมาย "Target-US"
<!-- /antipatterns/examples/1-12.xml --> <Quota name="Quota-Minute-Target-Server-US"> <Interval>1</Interval> <TimeUnit>minute</TimeUnit> <Distributed>true</Distributed> <Allow count="10"/> </Quota>
นโยบายโควต้าสำหรับปลายทางเป้าหมาย "Target-EU":
<!-- /antipatterns/examples/1-13.xml --> <Quota name="Quota-Minute-Target-Server-EU"> <Interval>1</Interval> <TimeUnit>minute</TimeUnit> <Distributed>true</Distributed> <Allow count="10"/> </Quota>
- ใช้นโยบายโควต้าที่เกี่ยวข้องในคำจำกัดความของปลายทางเป้าหมายดังที่แสดงด้านล่าง
ปลายทางเป้าหมาย "Target-US":
<!-- /antipatterns/examples/1-14.xml --> <TargetEndpoint name="Target-US"> <PreFlow name="PreFlow"> <Request> <Step> <Name>Quota-Minute-Target-Server-US</Name> </Step> </Request> <Response/> </PreFlow> <HTTPTargetConnection> <URL>http://target-us.somedomain.com</URL> </HTTPTargetConnection> </TargetEndpoint>
ปลายทางเป้าหมาย "Target-EU":
<!-- /antipatterns/examples/1-15.xml --> <TargetEndpoint name="Target-EU"> <PreFlow name="PreFlow"> <Request> <Step> <Name>Quota-Minute-Target-Server-EU</Name> </Step> </Request> <Response/> </PreFlow> <HTTPTargetConnection> <URL>http://target-eu.somedomain.com</URL> </HTTPTargetConnection> </TargetEndpoint>
- เนื่องจากเราใช้นโยบายโควต้าแยกต่างหากในอุปกรณ์ปลายทางเป้าหมาย "Target-US" และ "เป้าหมาย - สหภาพยุโรป" ระบบจะเก็บตัวนับแยกต่างหาก ซึ่งทำให้เราได้รับ โควต้าคำขอ API 10 รายการต่อนาทีสำหรับปลายทางเป้าหมายแต่ละแห่ง
- กำหนดนโยบายโควต้าแยกกันสำหรับปลายทางเป้าหมาย "Target-US" อย่างละ 1 นโยบาย
"เป้าหมาย - สหภาพยุโรป"
- ใช้องค์ประกอบ
<Class>
หรือ<Identifier>
เพื่อให้แน่ใจว่า จะมีตัวนับที่ไม่ซ้ำหลายตัวไว้