คุณกำลังดูเอกสารประกอบของ Apigee Edge
ไปที่เอกสารประกอบของ Apigee X ข้อมูล
Apigee Edge คือความสามารถในการกำหนดจำนวนคำขอที่อนุญาตสำหรับพร็อกซี API ในช่วงเวลาหนึ่งโดยใช้นโยบายโควต้า
ลายป้องกัน
หากมีการใช้นโยบายโควต้าซ้ำ ระบบจะลดตัวนับโควต้าทุกครั้งที่มีการดำเนินการกับนโยบายโควต้า ไม่ว่าจะใช้งานที่ใด กล่าวคือ เมื่อมีการใช้นโยบายโควต้าซ้ำ ให้ทำดังนี้
- ภายในขั้นตอนเดียวกันหรือขั้นตอนที่แตกต่างกันของพร็อกซี API
- ในปลายทางเป้าหมายที่แตกต่างกันของพร็อกซี API
จากนั้นตัวนับโควต้าจะลดลงทุกครั้งที่ดำเนินการ และเราจะได้รับข้อผิดพลาดเกี่ยวกับการละเมิดโควต้าเร็วกว่าที่คาดไว้ในช่วงระยะเวลาที่กำหนด
เราจะใช้ตัวอย่างต่อไปนี้ในการอธิบายวิธีการทำงาน
พร็อกซี API
สมมติว่าเรามีพร็อกซี API ชื่อ "TestTargetServerQuota" ซึ่งกำหนดเส้นทางการรับส่งข้อมูลไปยังเซิร์ฟเวอร์เป้าหมาย 2 เซิร์ฟเวอร์ที่แตกต่างกันตามเส้นทางทรัพยากร และเราต้องการจำกัดการรับส่งข้อมูล API ไว้ที่ 10 คำขอต่อนาทีสำหรับเซิร์ฟเวอร์เป้าหมายแต่ละเซิร์ฟเวอร์ ตารางที่แสดงสถานการณ์นี้
เส้นทางทรัพยากร | เซิร์ฟเวอร์เป้าหมาย | โควต้า |
---|---|---|
/target-us |
target-US.somedomain.com |
10 คำขอต่อนาที |
/target-eu |
target-EU.somedomain.com |
10 คำขอต่อนาที |
นโยบายโควต้า
เนื่องจากเซิร์ฟเวอร์เป้าหมายทั้งสองมีโควต้าการรับส่งข้อมูลที่เท่ากัน เราจึงกำหนดนโยบายโควต้ารายการเดียวที่มีชื่อว่า "โควต้านาที-เป้าหมาย-เซิร์ฟเวอร์" ดังที่แสดงด้านล่าง
<!-- /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>
และใช้นโยบายโควต้าเดียวกัน "โควต้า-นาที-เป้าหมาย-เซิร์ฟเวอร์" ซ้ำในขั้นตอนก่อนหน้าของปลายทางเป้าหมายอื่น "เป้าหมาย-สหภาพยุโรป" ด้วยเช่นกัน
<!-- /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>
เพื่อให้แน่ใจว่ามีตัวนับที่ไม่ซ้ำกันหลายรายการโดยการกำหนดนโยบายโควต้ารายการเดียว มากำหนดนโยบายโควต้าใหม่ "โควต้า-นาที-เป้าหมาย-เซิร์ฟเวอร์" ที่เราเพิ่งอธิบายไปในส่วนที่แล้วโดยใช้ส่วนหัว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-EU" เช่นเดิม
- คราวนี้สมมติว่าหากส่วนหัว
target_id
มีค่าเป็น "US" คำขอจะมีการกำหนดเส้นทางไปยังปลายทางเป้าหมาย "Target-US" - ในทำนองเดียวกัน หากส่วนหัว
target_id
มีค่าเป็น "EU" ระบบจะกำหนดเส้นทางคำขอไปยังปลายทางเป้าหมาย "Target-EU" - ดังนั้น แม้ว่าเราจะใช้นโยบายโควต้าเดียวกันในปลายทางเป้าหมายทั้ง 2 แห่ง แต่ตัวนับโควต้าที่แยกกันจะยังคงอยู่ตามค่า
<Identifier>
- ดังนั้นการใช้องค์ประกอบ
<Identifier>
จะช่วยให้เรามั่นใจได้ว่าปลายทางเป้าหมายแต่ละแห่งได้รับโควต้าคำขอ 10 รายการที่อนุญาต
- ใช้นโยบายโควต้าแยกต่างหากในแต่ละโฟลว์/ปลายทางเป้าหมาย/พร็อกซี API เพื่อให้ได้รับจำนวนคำขอ API ที่อนุญาตเสมอ มาดูตัวอย่างเดียวกับที่ใช้ในส่วนด้านบนกันเพื่อดูว่าเราจะทำตามโควต้าคำขอ 10 รายการที่อนุญาตสำหรับปลายทางเป้าหมายแต่ละรายการได้อย่างไร
- กำหนดนโยบายโควต้าแยกกัน โดยแต่ละรายการสำหรับปลายทางเป้าหมาย "Target-US" และ "Target-EU"
นโยบายโควต้าสำหรับปลายทางเป้าหมาย "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" และ "Target-EU" จึงมีตัวนับแยกต่างหาก วิธีนี้จะช่วยให้มั่นใจได้ว่าเราได้รับโควต้าคำขอ API จำนวน 10 รายการต่อนาทีที่อนุญาตสำหรับปลายทางเป้าหมายแต่ละรายการ
- กำหนดนโยบายโควต้าแยกกัน โดยแต่ละรายการสำหรับปลายทางเป้าหมาย "Target-US" และ "Target-EU"
- ใช้องค์ประกอบ
<Class>
หรือ<Identifier>
เพื่อรักษาตัวนับที่ไม่ซ้ำกันหลายรายการ