我们的组织目前正在迁往远地点。
目前,我遇到了一个与这个问题非常相似的问题,但由于我是一个堆栈溢出的新来者,而且名声很低,我无法对此发表评论:阿皮吉- SpikeArrest行为。
因此,在我们的组织中,我们有6 MessageProcessors (MP),我认为他们是以严格的循环方式工作的。
请查看此配置(它应用于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>3pm</Rate>
</SpikeArrest>我的速度是下午3点,这意味着每20秒就有1次命中,根据ApigeeDoc1的计算。
的问题是,不是每20秒成功命中1次,而是在20秒的范围内得到6次成功的命中,然后是SpikeArrest错误,这意味着它以循环的方式击中每个MP一次。
--这意味着我的api后端每20秒有6次命中,而不是每秒1次命中。
有什么方法来同步下议院议员的弹弓吗?
ConcurrentRatelimit似乎帮不上忙。
发布于 2014-04-25 18:01:25
SpikeArrest不具备跨消息处理器分发的能力。它通常用于阻止大量的交通突发,而不是控制你建议的水平(每分钟3个电话)。通常,如果流量太高,则将其放入代理请求Preflow中并中止。
使用SpikeArrest与循环消息处理器一起使用时,最接近每分钟3次的是每分钟1次,这将导致每分钟6次调用。您只能将SpikeArrests指定为"n /秒“或"n /分钟”,这将被转换为" 1 /n秒1“或" 1 /n分钟1/n分钟”。
你真的在你的后端每20秒只支持一个呼叫吗?如果您试图支持每个用户或应用程序每20秒一次调用,那么我建议您尝试使用配额政策来完成这一任务。配额可以在所有消息处理器之间共享一个计数器。您还可以通过指定一个常量的配额标识符来对所有通信量(而不是每个用户或每个应用程序)使用配额。你可以允许每分钟3分钟,但他们都可以在同一时间进来,在这一分钟。
如果您只是试图防止过度征税您的后端,ConcurrentRateLimit政策经常被使用。
最后一个解决方案是实现一些自定义代码。
解决进一步问题的最新情况:
重申:
要获得您想要的粒度,您需要使用配额。不幸的是,您不能将配额设置为在分布式配额上具有“每秒”值(分布式配额在消息处理器之间共享计数,而不是每个消息处理器都有自己的计数器)。你能做的最好是每分钟,这在你的情况下是每分钟300个电话。否则,您可以使用非分布式配额(在6个消息处理器之间划分配额),但是您将遇到的问题是,一些MPs上的调用将被拒绝,而另一些将被接受,这可能会使您的开发人员感到困惑。
对于分布式配额,您可以在APIProduct中设置每分钟300个调用(参见医生们),并将该产品分配给您的四个应用程序。然后,在您的代码中,如果没有为当前API调用的应用程序分配该产品,您将使用硬编码为每秒10 (600分钟)的配额,并使用常量标识符而不是client_id,以便所有其他流量都使用该配额。
配额并不妨碍您几乎同时提交所有请求,而且我假设后端不能同时处理所有1200+请求。您需要使用SpikeArrest策略来平滑通信量。您将希望允许后端处理的最大流量通过SpikeArrest。这将有助于防止流量激增,但可能会导致某些流量被拒绝,这通常是配额允许的。应该在配额之前检查SpikeArrest策略,这样拒绝的流量就不会被计算在应用程序的配额中。
正如您可能看到的,为像您这样的情况配置更多的是一门艺术,而不是一门科学。我的建议是进行重要的性能/负载测试,并对其进行优化,直到找到正确的值。如果你能找到如何使用非分配配额来获得可接受的性能和可预见性,那么你就可以使用每秒的数字,而不是每分钟的数字,这可能会降低大幅度的峰值的可能性。
祝好运!
发布于 2014-04-25 17:51:28
与配额限制不同的是,Spike停止不能在MP之间同步。
但是,当您将它们设置在每分钟的水平上时,您可以使用配额策略--然后将其设置为分布式和同步的,它将在MP之间进行协调。
请记住,跨机器的同步总是会有一些延迟,所以永远不会是一个完全精确的数字。
https://stackoverflow.com/questions/23298849
复制相似问题