Antipattern: ใช้นโยบายโควต้าซ้ำ

คุณกำลังดูเอกสารประกอบของ 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 รายการต่อนาทีที่อนุญาตสำหรับปลายทางเป้าหมายแต่ละรายการ
  • ใช้องค์ประกอบ <Class> หรือ <Identifier> เพื่อรักษาตัวนับที่ไม่ซ้ำกันหลายรายการ