Chống lỗi: Sử dụng lại chính sách Hạn mức

Bạn đang xem tài liệu về Apigee Edge.
Chuyển đến Tài liệu về Apigee X.
thông tin

Apigee Edge cung cấp khả năng định cấu hình số lượng yêu cầu được phép đối với Proxy API cho một khoảng thời gian cụ thể bằng cách sử dụng chính sách Hạn mức.

Phản mẫu

Nếu bạn sử dụng lại một chính sách về hạn mức, thì bộ đếm hạn mức sẽ bị giảm mỗi khi Chính sách về hạn mức được thực thi bất kể vị trí mà chính sách này được sử dụng. Tức là, nếu chính sách Hạn mức là được sử dụng lại:

  • Trong cùng một quy trình hoặc nhiều luồng của một Proxy API
  • Trong các điểm cuối mục tiêu khác nhau của Proxy API

Sau đó, bộ đếm hạn mức sẽ được giảm dần mỗi khi thực thi bộ đếm và chúng ta sẽ nhận được Lỗi vi phạm hạn mức sớm hơn nhiều so với dự kiến trong khoảng thời gian được chỉ định.

Hãy xem ví dụ sau đây để giải thích cách hoạt động của quy trình này.

Proxy API

Giả sử chúng ta có một Proxy API tên là “TestTargetServer”. máy chủ mục tiêu khác nhau dựa trên đường dẫn tài nguyên. Chúng tôi muốn hạn chế lưu lượng truy cập qua API 10 yêu cầu mỗi phút cho mỗi máy chủ mục tiêu này. Đây là bảng mô tả việc này trường hợp:

Đường dẫn tài nguyên Máy chủ đích Hạn mức
/target-us target-US.somedomain.com 10 yêu cầu mỗi phút
/target-eu target-EU.somedomain.com 10 yêu cầu mỗi phút

Chính sách về hạn mức

Vì hạn mức lưu lượng truy cập cho cả hai máy chủ mục tiêu là như nhau, nên chúng tôi xác định một chính sách Hạn mức duy nhất có tên là "Máy chủ mục tiêu hạn mức phút" như được trình bày dưới đây:

<!-- /antipatterns/examples/1-8.xml -->
<Quota name="Quota-Minute-Target-Server">
  <Interval>1</Interval>
  <TimeUnit>minute</TimeUnit>
  <Distributed>true</Distributed>
  <Allow count="10"/>
</Quota>

Điểm cuối mục tiêu

Hãy sử dụng chính sách về Hạn mức "Máy chủ mục tiêu theo hạn mức" trong luồng trước của điểm cuối mục tiêu "Nhắm mục tiêu đến Hoa Kỳ":

<!-- /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>

Và sử dụng lại chính sách Hạn mức "Máy chủ mục tiêu hạn mức phút" trong luồng trước của mục tiêu khác điểm cuối “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>

Mẫu lưu lượng truy cập đến

Giả sử chúng ta nhận được tổng cộng 10 yêu cầu API cho Proxy API này trong vòng 30 giây đầu tiên ở mẫu sau:

Đường dẫn tài nguyên /target-us /target-eu Tất cả
# yêu cầu 4 6 10

Một lúc sau, chúng ta nhận được yêu cầu API thứ 11 với đường dẫn tài nguyên là /target-us, giả sử sau 32 giây.

Chúng ta dự kiến yêu cầu sẽ được xử lý thành công nếu giả định rằng chúng ta vẫn còn 6 yêu cầu API cho điểm cuối mục tiêu target-us theo hạn mức cho phép.

Tuy nhiên, trên thực tế, chúng ta nhận được Quota violation error.

Lý do: Vì chúng tôi đang sử dụng cùng một chính sách Hạn mức cho cả hai điểm cuối mục tiêu, bộ đếm hạn mức duy nhất được dùng để theo dõi các yêu cầu API truy cập đến cả hai điểm cuối mục tiêu. Do đó, chúng tôi sử dụng chung hạn mức 10 yêu cầu mỗi phút thay vì cho mục tiêu riêng lẻ điểm cuối.

Tác động

Phản mẫu này có thể dẫn đến sự không khớp căn bản với kỳ vọng, dẫn đến nhận thức rằng hạn mức đã hết trước thời hạn.

Phương pháp hay nhất

  • Hãy sử dụng phần tử <Class> hoặc <Identifier> để đảm bảo có nhiều các bộ đếm riêng biệt được duy trì bằng cách xác định một chính sách về hạn mức duy nhất. Hãy xác định lại chính sách Hạn mức "Máy chủ mục tiêu hạn mức phút" mà chúng tôi vừa giải thích trong phần trước bằng cách sử dụng tiêu đề target_id làm <Identifier> cho như minh hoạ dưới đây:
    <!-- /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>
    
    • Chúng tôi sẽ tiếp tục sử dụng chính sách Hạn mức này trong cả hai điểm cuối mục tiêu "Target-US" và "Target-EU" (Mục tiêu tại Liên minh Châu Âu) như trước đây.
    • Bây giờ, giả sử nếu tiêu đề target_id có giá trị "US" thì các yêu cầu được định tuyến đến nhắm mục tiêu điểm cuối "Target-US".
    • Tương tự, nếu tiêu đề target_id có giá trị "EU" thì các yêu cầu sẽ được chuyển đến đích điểm cuối “Target-EU”.
    • Vì vậy, ngay cả khi chúng ta sử dụng cùng một chính sách Hạn mức trong cả hai điểm cuối mục tiêu, các bộ đếm hạn mức riêng biệt đều được duy trì dựa trên giá trị <Identifier>.
    • Do đó, bằng cách sử dụng phần tử <Identifier>, chúng ta có thể đảm bảo rằng từng điểm cuối mục tiêu nhận được hạn mức 10 yêu cầu cho phép.
  • Sử dụng chính sách Hạn mức riêng trong mỗi luồng/điểm cuối mục tiêu/Proxy API để đảm bảo bạn luôn nhận được số lượng yêu cầu API được phép. Giờ hãy xem cùng một ví dụ được dùng trong ở trên để xem cách đạt được hạn mức cho phép là 10 yêu cầu cho mỗi mục tiêu điểm cuối.
    • Xác định một chính sách riêng về Hạn mức, mỗi chính sách cho một điểm cuối mục tiêu "Target-US" và "Target-EU"

      Chính sách về hạn mức cho Điểm cuối mục tiêu "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>
      

      Chính sách về hạn mức cho Điểm cuối mục tiêu "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>
      
    • Sử dụng chính sách hạn mức tương ứng trong định nghĩa về các điểm cuối mục tiêu như trình bày dưới đây:

      Thiết bị đầu cuối mục tiêu "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>
      

      Thiết bị đầu cuối mục tiêu "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>
      
    • Vì chúng tôi đang sử dụng chính sách Hạn mức riêng trong các điểm cuối mục tiêu "Target-US" và “Target-EU”, sẽ có một bộ đếm riêng. Điều này đảm bảo rằng chúng tôi nhận được hạn mức 10 yêu cầu API mỗi phút cho mỗi điểm cuối mục tiêu.
  • Sử dụng phần tử <Class> hoặc <Identifier> để đảm bảo có nhiều bộ đếm duy nhất được duy trì.