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.
Truy cập vào tài liệu 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 gửi đến một API Proxy trong một khoảng thời gian cụ thể bằng cách sử dụng chính sách Hạn mức.

Antipattern

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

Hãy cùng xem một ví dụ để hiểu rõ hơn về điều này. Hãy cân nhắc Chính sách hạn mức sau đây cho một 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, những điều sau 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 đến API Proxy đang được hai Trình xử lý thông báo xử lý.
  • Mỗi Trình xử lý thông báo duy trì biến đếm hạn mức riêng, quota_count_mp1quota_count_mp2, để theo dõi số lượng yêu cầu mà chúng đang xử lý.
  • Do đó, mỗi Trình xử lý thông báo sẽ cho phép 100 yêu cầu API riêng biệt. Hiệu ứng ròng là tổng cộng 200 yêu cầu được xử lý thay vì 100 yêu cầu.

Tác động

Tình huống này làm mất mục đích của cấu hình hạn mức và có thể gây ảnh hưởng bất lợi đến các máy chủ phụ trợ đang phân phát yêu cầu.

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

  • Bị 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 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ả Trình xử lý thông báo. Bạn có thể đặt 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>