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

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