RateLimiter:限流N个请求,但允许通过了N+个请求

问题描述

RateLimiter:限流N个请求,但允许通过了N+个请求
标题

问题分析 

RateLimiter内部有个实现:SmoothBursty

SmoothBursty

  • SmoothBursty限流器使用令牌桶算法实现,这个限流器在空闲时候能够存储一定的令牌(默认是1秒钟时间产生的令牌),可以应对空闲一段时间后突然的爆发量请求。
  • guava的RateLimiter有一个核心的设计思想:当前请求的债务(请求的令牌大于限流器存储的令牌数)由下一个请求来偿还(上个请求亏欠的令牌,下个请求需要等待亏欠令牌生产出来以后才能被授权)。
  • 具体参考:https://blog.****.net/fly910905/article/details/103644950
  • 因此,如果第一秒的请求时空闲很久后的有一次请求,这时RateLimiter中已经存储了N个限流请求(默认是存储了1s的限流数),这事总的可允许请求数就是:N< 空闲后第一次可允许请求数 < 2N