我将通过提供一些有关我们正在做的事情和我们面临的问题的上下文来开始我的问题。
目前,我们没有策略来限制或限制租户在给定时间内可以发出的请求数量。考虑到上面的最后两个注意事项,很容易看到这是一个问题,因为租户发出的请求数量超出我们的处理能力几乎是微不足道的,从而导致服务质量下降(即使对于其他租户,由于共享资源方法)。
我们正在考虑限制/节流策略,或者总体上准备系统来“隔离”租户,因此,一个租户不会通过提出超出我们处理能力的请求来降低其他租户的性能:
现在,我们倾向于采用选项4。我们希望以某种方式实施请求限制(流量整形),以使在先前与租户商定的价格范围内(通过合同强制执行)的所有请求都可以通过顺畅地提供服务。由于我们提前知道了每个租户每分钟将要发出多少请求(至少被估计),因此我们可以相应地调整基础架构的大小(加上安全裕度)。
如果突发到达,则多余的请求将排队(达到限制),然后以固定的速率释放(使用漏斗或类似算法)。这将确保租户不会影响其他租户的性能,因为请求将以预定义的速率到达服务。理想情况下,允许的请求速率将是“动态的”,以使租户可以使用其他不使用租户的“每分钟请求数”(在安全限制内)。我相信这称为“动态速率漏斗”算法。目标是最大限度地利用资源。
我的问题是:
非常感谢你, 米克尔。
答案 0 :(得分:2)
在网关端管理请求队列确实是一件棘手的事情,并且可能之所以无法在此网关中实现它,可能是因为这样做确实很难。您需要处理所有分布式系统的情况,此外,很难做到“安全”,因为“慢”的客户端会很快消耗机器资源。
这种模式通常会卸载到客户端库,因此,当客户端达到速率限制状态代码时,它将使用诸如指数回退技术之类的smth重试请求。这是更容易扩展和实施的方法。
不能说Kong,但是在这种情况下,Tyk提供了两个您可以控制的基本数字:配额-客户在给定时间内可以提出的最大请求数,以及速率限制-安全保护。您可以为每个“策略”设置费率限制1),例如,针对一组消费者(例如,如果您的服务具有多个层,具有不同的允许使用/费率限制),则可以为每个密钥设置2)3)针对API(有效)以及关键速率限制)。因此,例如,您可以设置一些中等的客户费率限制,并使用全局API设置来限制总限制。
如果您想要完全动态的方案,并根据群集负载重新计算限制,则应该可以。您将需要在某个地方编写和运行此调度程序,它会不时根据当前的总使用量(Tyk为您计算,您可以从Redis获得它)执行重新计算,并通过迭代与Tyk API进行通信通过所有密钥(或策略)并动态更新其速率限制。
希望有道理:)