反模式:配置非分布式配额

您正在查看的是 Apigee Edge 文档。
转到 Apigee X 文档
信息

借助 Apigee Edge,您可以使用配额政策配置在特定时间段内向 API 代理发送的允许请求数。

反模式

API 代理请求可由名为“消息处理器”的一个或多个分布式 Edge 组件处理。如果配置了多个消息处理器来处理 API 请求,则很可能会超出配额,因为每个消息处理器都会保留自己所处理的请求的“计数”。

让我们借助一个示例来解释这一点。请考虑某个 API 代理的以下配额政策

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

上面的配置每小时应该允许处理共 100 个请求。

但实际上,如果有多个消息处理器处理 API 请求,会发生以下情况:

在上面的图示中:

  • 配额政策配置为每小时允许处理 100 个请求。
  • 向 API 代理发送的请求正在由两个消息处理器处理。
  • 每个消息处理器都设有自己的配额计数变量(quota_count_mp1quota_count_mp2)来跟踪其正在处理的请求数。
  • 因此,每个消息处理器将分别允许处理 100 个 API 请求。实际结果是总共处理了 200 个请求,而不是 100 个请求。

影响

这种情况不符合配额配置的目的,会对处理请求的后端服务器产生不利影响。

后端服务器可能会出现以下情况:

  • 由于传入的流量高于预期流量而受到压力
  • 对较新的 API 请求没有响应,导致 503 错误

最佳做法

您可以考虑在配额政策中将 <Distributed> 元素设置为 true,以确保使用一个共用的计数器来跟踪所有消息处理器中的 API 请求。可以按以下代码段所示设置 <Distributed> 元素:

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