Chống mô hình: Định cấu hình hạn mức không được phân phối

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 cho phép định cấu hình số lượng yêu cầu được phép gửi đến một Proxy API trong một khoảng thời gian cụ thể bằng cách sử dụng Chính sách về hạn mức.

Phản mẫu

Một hoặc nhiều thành phần Edge được phân phối có tên là Message Processors (Trình xử lý thư) có thể phân phát yêu cầu proxy API. Nếu có nhiều Trình xử lý thông báo được định cấu hình để phân phát yêu cầu API, thì hạn mức có thể sẽ bị vượt quá vì mỗi Trình xử lý thông báo đều có "số lượng" yêu cầu riêng.

Hãy tham khảo một ví dụ để giải thích điều này. Hãy xem xét Chính sách về hạn mức sau đây cho proxy API:

<!-- /antipatterns/examples/1-6.xml -->
<Quota name="CheckTrafficQuota">
  <Interval>1</Interval>
  <TimeUnit>hour</TimeUnit>
  <Allow count="100"/>
</Quota>

Cấu hình ở trên sẽ cho phép tổng cộng 100 yêu cầu mỗi giờ.

Tuy nhiên, trên thực tế, khi nhiều trình xử lý thông báo đang phân phát các yêu cầu API, thì những điều sau đây sẽ xảy ra:

Trong hình minh hoạ ở trên:

  • Chính sách hạn mức được định cấu hình để cho phép 100 yêu cầu mỗi giờ.
  • Các yêu cầu đối với Proxy API đang được 2 Bộ xử lý thông báo thực hiện.
  • Mỗi Trình xử lý thông báo duy trì một biến số lượng hạn mức riêng, quota_count_mp1quota_count_mp2, để theo dõi số lượng yêu cầu mà họ đang xử lý.
  • Do đó, mỗi Trình xử lý thông báo sẽ cho phép thực hiện 100 yêu cầu API riêng biệt. Kết quả cuối cùng là tổng cộng 200 yêu cầu được xử lý thay vì 100 yêu cầu.

Mức độ tác động

Tình huống này phá vỡ mục đích của cấu hình hạn mức và có thể có tác động xấu đến các máy chủ phụ trợ đang phân phát yêu cầu.

Máy chủ phụ trợ có thể:

  • Căng thẳng do lưu lượng truy cập đến cao hơn dự kiến
  • Không phản hồi các yêu cầu API mới hơn dẫn đến lỗi 503

Phương pháp hay nhất

Hãy cân nhắc việc đặt phần tử <Distributed> thành true trong Chính sách về hạn mức để đảm bảo rằng một bộ đếm chung được dùng để theo dõi các yêu cầu API trên tất cả các Trình xử lý thông báo. Bạn có thể thiết lập phần tử <Distributed> như minh hoạ trong đoạn mã dưới đây:

<!-- /antipatterns/examples/1-7.xml -->
<Quota name="CheckTrafficQuota">
  <Interval>1</Interval>
  <TimeUnit>hour</TimeUnit>
  <Distributed>true</Distributed>
  <Allow count="100"/>
</Quota>