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 cung cấp khả năng định cấu hình số lượng yêu cầu được phép cho một 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

Yêu cầu proxy API có thể được phân phát bởi một hoặc nhiều thành phần Edge được phân phối được gọi là Trình xử lý thư. Nếu có nhiều Trình xử lý thư được định cấu hình để phân phát API thì có khả năng vượt quá hạn mức vì mỗi Trình xử lý thư đều có riêng "số lượng" của các yêu cầu mà nó xử lý.

Hãy cùng giải thích điều này với sự trợ giúp của một ví dụ. Cân nhắc Chính sách về hạn mức sau đây cho một API proxy:

<!-- /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 phân phát các yêu cầu API, sau đây xảy ra:

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

  • Chính sách hạn mức được thiết lập để cho phép 100 yêu cầu mỗi giờ.
  • Các yêu cầu tới Proxy API đang được phân phát bởi 2 Trình xử lý thư.
  • Mỗi Trình xử lý thư duy trì 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à các công cụ này đang xử lý.
  • Do đó, mỗi Trình xử lý thư sẽ cho phép 100 yêu cầu API riêng biệt. Hiệu ứng ròng là tổng cộng có 200 yêu cầu được xử lý thay vì 100 yêu cầu.

Tác động

Tình huống này phá vỡ mục đích của việc định cấu hình hạn mức và có thể có tác động bất lợi đối với các máy chủ phụ trợ đang phân phối 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 vớ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 thành đảm bảo sử dụng một bộ đếm chung để theo dõi các yêu cầu API trên tất cả Bộ xử lý thư. 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>