问题描述
接口:getUrlDic我设置了限流5个,但是在第一秒的请求了,实际允许通过了9个(或10个),之后正常
RateLimiter使用方式参考:https://blog.csdn.net/fly910905/article/details/103644950
标题
问题分析
RateLimiter内部有个实现:SmoothBursty
SmoothBursty
SmoothBursty限流器使用令牌桶算法实现,这个限流器在空闲时候能够存储一定的令牌(默认是1秒钟时间产生的令牌),可以应对空闲一段时间后突然的爆发量请求。
guava的RateLimiter有一个核心的设计思想:当前请求的债务(请求的令牌大于限流器存储的令牌数)由下一个请求来偿还(上个请求亏欠的令牌,下个请求需要等待亏欠令牌生产出来以后才能被授权)。
具体参考:https://blog.csdn.net/fly910905/article/details/103644950
因此,如果第一秒的请求时空闲很久后的有一次请求,这时RateLimiter中已经存储了N个限流请求(默认是存储了1s的限流数),这事总的可允许请求数就是:N< 空闲后第一次可允许请求数 < 2N
来源:CSDN
作者:goodpinna
链接:https://blog.csdn.net/goodpinna/article/details/103668352