在RequestRateLimiter的Redis实现中,我们必须指定两个属性redis-rate-limiter.replenishRate
和redis-rate-limiter.burstCapacity
作为RequestRateLimiter过滤器的参数。
根据文档的说法
redis-rate-limiter.replenishRate
是指您希望允许用户每秒执行多少次请求,而不需要任何删除请求。这是令牌桶被填充的速率。redis-rate-limiter.burstCapacity
是用户允许在一秒钟内完成的最大请求数。这是令牌桶可以容纳的令牌数。将此值设置为零将阻止所有请求。
据我所见,replenishRate
是发出请求的rate,burstCapacity
是可以发出的最大值请求(都在1秒以下)。然而,在一个实际的场景中,我似乎无法理解两者之间的区别。
发布于 2020-01-22 07:17:41
使用不同的时间单位更容易理解,例如:
前者控制您永远不会马上收到超过1000个请求,而则允许您在同一秒钟内支持高达500个请求的临时加载峰值。您可能在第二0中有一个500次突发,在第二次1中又有一个500次突发,并且您已经达到了速率限制(在同一分钟内有1000次请求),因此在接下来的58秒内将删除新的请求。
在Spring (SCG)的上下文中,文档有点模糊(the rate limiter needs to be allowed some time...
):
通过在replenishRate和burstCapacity中设置相同的值来实现一个稳定的速率。通过将burstCapacity设置为高于replenishRate,可以允许临时突发。在这种情况下,速率限制器需要有一段时间间隔(根据replenishRate),因为两个连续的突发将导致丢弃请求(HTTP429-太多的请求)。
根据前面的例子推断,SCG的工作方式如下:
您可以在同一秒钟(第二次0)内获得2000次请求的突发(峰值)。由于您的补充率是1000 rps,您已经通过了两个周期的津贴,所以您不能发送另一条消息,直到第二3。
https://stackoverflow.com/questions/58606122
复制相似问题