跨消息处理器(MPs)的Apigee同步

跨消息处理器(MPs)的Apigee同步,api,backend,apigee,throttling,Api,Backend,Apigee,Throttling,我们的组织目前正在迁移到Apigee 我目前的问题与此非常相似,但由于我是一名StackOverflow新手,声誉很低,因此我无法对此发表评论: 如果有任何方法可以合并这两个问题,请让我知道 因此,在我们的组织中,我们有6个MessageProcessor(MP),我认为他们是以严格的循环方式工作的 请参阅此配置(它应用于ApiProxy的目标端点): Spike-1 下午三点 我有一个下午3点的比率,这意味着每20秒命中一次,根据 问题是,不是每20秒成功命中1次,而是在20秒范围内成功命

我们的组织目前正在迁移到Apigee

我目前的问题与此非常相似,但由于我是一名StackOverflow新手,声誉很低,因此我无法对此发表评论:

如果有任何方法可以合并这两个问题,请让我知道

因此,在我们的组织中,我们有6个MessageProcessor(MP),我认为他们是以严格的循环方式工作的

请参阅此配置(它应用于ApiProxy的目标端点):


Spike-1
下午三点
我有一个下午3点的比率,这意味着每20秒命中一次,根据

问题是,不是每20秒成功命中1次,而是在20秒范围内成功命中6次,然后出现防刺错误,这意味着它以循环方式命中每个MP。

这意味着我的api后端每20秒命中6次,而不是期望的每20秒命中1次。

有没有办法在MPs之间同步峰值逮捕?

ConcurrentRatelimit似乎没有帮助

非常感谢您的任何帮助或建议


谢谢

与配额限制不同,峰值停止不能跨MP同步

但是,当您将它们设置为每分钟级别时,您可以改用配额策略——然后将其设置为分布式和同步,它将跨MP进行协调


请记住,机器之间的同步总是会有一些延迟,因此它永远不会是一个完全精确的数字

SpikeRestrip无法跨消息处理器分发。它通常用于阻止流量的大爆发,而不是控制您建议的流量水平(每分钟3次呼叫)。您通常将其放入代理请求预流中,如果流量过高,则中止

通过循环消息处理器使用SpikeRestart,最接近每分钟3次,即每分钟1次,这将导致每分钟6次呼叫。您只能将SpikeArrests指定为“n/s”或“n/min”,它会转换为“1/1/n秒”或“1/1/n分钟”,正如您上面提到的那样

你真的只支持在你的后端每20秒打一个电话吗?如果您尝试为每个用户或应用程序每20秒支持一次呼叫,那么我建议您尝试使用。配额可以在所有消息处理器之间共享一个计数器。通过指定一个常量配额标识符,您还可以对所有流量(而不是每个用户或每个应用程序)使用配额。你可以允许每分钟3次,但他们可以在这一分钟内同时进来

如果您只是想防止后端负担过重,通常会使用

最后一个解决方案是实现一些自定义代码


更新以解决进一步的问题: 重申:

  • 6个消息处理器处理循环
  • 希望4个应用每秒允许5次呼叫
  • 希望其余的应用每秒共享10个电话
要获得所需的粒度,需要使用配额。不幸的是,您不能将配额设置为在分布式配额上具有“每秒”值(分布式配额在消息处理器之间共享计数,而不是让每个消息处理器都有自己的计数器)。你能做的最好的是每分钟,在你的情况下是每分钟300个电话。否则,您可以使用非分布式配额(在6个消息处理器之间划分配额),但您将遇到的问题是,在某些MPs上登陆的调用将被拒绝,而其他调用将被接受,这可能会让您的开发人员感到困惑

对于分布式配额,您可以在API产品中设置每分钟300次调用(请参阅),并将该产品分配给您的四个应用程序。然后,在您的代码中,如果该产品未分配给当前API调用的应用程序,您将使用硬编码为每秒10次(每分钟600次)的配额,并使用常量标识符而不是客户端id,以便所有其他流量使用该配额

配额不会阻止您几乎同时提交所有请求,我假设您的后端无法同时处理1200多个请求。你需要使用尖峰拦截策略使交通顺畅。您需要允许后端能够处理的最大流量通过网络。这将有助于防止流量高峰,但您可能会得到一些通常配额允许的被拒绝的流量。应在配额之前检查SpikeJust策略,以便拒绝的流量不计入应用程序的配额

正如您可能看到的,为您这样的情况进行配置与其说是一门科学,不如说是一门艺术。我的建议是进行重要的性能/负载测试,并对其进行调整,直到找到正确的值。如果您能够找到如何使用非分布式配额来获得可接受的性能和可预测性,那么您就可以使用每秒数而不是每分钟数,这可能会降低出现大规模峰值的可能性

祝你好运

<?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>