【问题标题】:Apigee Spike Arrest Rate Limit ApplicationApigee Spike Arrest Rate 限制应用程序
【发布时间】:2014-06-09 16:01:38
【问题描述】:

我是 Apigee 新手。

我正在尝试了解 Spike Arrest 政策。

我正在查看此文档:
http://apigee.com/docs/api-services/content/shield-apis-using-spikearrest
http://apigee.com/docs/api-services/content/policy-attachment-and-enforcement

我无法确定的一件事是,当 Spike Arrest Policy 应用于 ApiProxy 时,速率限制是针对每个密钥/客户端开发应用程序应用,还是在所有密钥/客户端开发应用程序之间共享?

例如,如果我们有以下配置:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
  <SpikeArrest async="false" continueOnError="false" enabled="true" name="spikearrest-1">
  <DisplayName>SpikeArrest-1</DisplayName>
  <FaultRules/>
  <Properties/>
  <Identifier ref="request.header.some-header-name"/>
  <MessageWeight ref="request.header.weight"/>
  <Rate>50ps</Rate>
</SpikeArrest>

和客户端开发应用程序:
1. DevApp1
2. DevApp2

DevApp1DevApp2 之间共享 50ps 速率限制,还是 DevApp1DevApp2 各自获得 50ps 速率限制?

谢谢,

【问题讨论】:

  • 根据下面的链接,每个 API 包、每个策略名称都维护计数。这意味着即使标识符相同,也不会跨包共享计数。请查看此答案以获取更多详细信息。 stackoverflow.com/questions/21614059/…。所以,你下面的场景应该不是问题,因为 count 是独立的。
  • 感谢@Diego!我目前有这个问题:stackoverflow.com/questions/21912316/… 在我们的组织中,我们有 6 个 MessageProcessors(MP),我假设它们在严格的循环中工作。如果我的速率为下午 3 点,这意味着每 20 秒命中 1 次,而不是每 20 秒成功命中 1 次,我在 20 秒范围内得到 6 次成功命中,然后是尖峰制动错误,这意味着每个 MP 命中一次。这意味着我每 20 秒得到 6 个而不是 1 个。有没有办法在 MP 之间同步尖峰逮捕? ConcurrentRatelimit 似乎没有帮助。

标签: api backend apigee throttling


【解决方案1】:

您可以使用任何预定义变量: http://apigee.com/docs/api-services/api/variables-reference

可能最常用于 Spike Arrest 的变量是 client.ip。 Edge 将使请求消息的所有元素都可用。如果您的客户将 client_id(也称为 API 密钥)作为查询参数添加到请求中,例如 api.call.com?client_id=u34r8ur,那么您可以将 Spike Arrest Identifier 中的变量设置为:

&lt;Identifier ref="request.queryparam.client_id"/&gt;

或者如果它在 HTTP 标头中:

&lt;Identifier ref="request.header.client_id"/&gt;

希望有帮助!

【讨论】:

  • 为了完整起见,如果你想使用client.ip,你可以使用:&lt;Identifier ref="client.ip"/&gt;
  • 这非常有帮助,尤其是带有天气的示例,它是一个查询参数或标题!谢谢,我很感激!我仍然无法找到的是如何在代理端点有条件地做到这一点。例如,我希望 App1 具有 5ps、App2 - 5ps、App3 - 1ps、App4 - 2ps - 所有这些都在代理端点上。如果我只有 25ps,那么例如 App2 可以消耗所有这些资源并使其余资源不可用,我想避免这种情况。你知道我是否有办法做到这一点?
  • 您能更详细地描述您的要求吗?如果您的目标是控制消费,那么使用其他方法(例如配额)可能更有意义。
  • 谢谢!但我确实需要一个 SpikeArrest。我目前有这个问题:stackoverflow.com/questions/21912316/… 在我们的组织中,我们有 6 个 MessageProcessors(MP),我假设它们在严格循环中工作。如果我的速度是下午 3 点,这意味着每 20 秒命中 1 次,而不是每 20 秒成功命中 1 次,我在 20 秒范围内得到 6 次成功命中,然后是尖峰制动错误,这意味着每个 MP 命中一次。这意味着我每 20 秒得到 6 个而不是 1 个。有没有办法在 MP 之间同步尖峰逮捕? ConcurrentRatelimit 似乎没有帮助。
【解决方案2】:

它的per app 由您的标识符标识。

【讨论】:

  • 非常感谢您的快速回复@Srikanth!所以目前我们有默认设置“”。目前这有什么作用吗,它有效吗?还是我需要设置其他内容而不是“request.header.some-header-name”,例如“request.header.client_id”?我问这个是因为“some-header-name”对我来说看起来像是一个占位符,而不是一个实际的变量。还有“some-header-name”的效果/行为是什么,它有什么作用吗?
  • 标识符是识别应用程序的方式。这是速率限制的关键。
  • Atanas, 'request.header.some-header-name' 不起作用——它只是试图表明您可以放置​​任何满足您要求的变量(预定义或自定义)要求。我们将更新文档以使其更清晰。谢谢。
  • 谢谢@ap-andrew!那么哪个是功能性的呢?我正在查看变量参考,以尝试确定使用什么?我没有看到那里指定的“client_id”,这也不起作用吗?
猜你喜欢
  • 1970-01-01
  • 2021-03-12
  • 2021-07-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多