@hupuxiaojun 上面的修复通过调度去定期重置令牌桶,确实存在不是任意时间窗口请求量都是设定的值的问题,会存在毛刺。其实dubbo本身的令牌桶实现也同样存在这样的毛刺。
> 假设interval=60s,rate=5000 意味着1分钟最多能接受5000次请求。假设在10:00:00时刻令牌桶被重置了(即lastResetTime=10:00:00.000),根据`if (now > lastResetTime + interval) `的条件,最早需要在10:01:00.001时刻令牌桶才被重新重置(“最早”是因为重置令牌为有请求进来且满足时间条件,被动策略),在极端情况,在10:00:01 ~ 10:00:59这段时间没有请求,在第59秒有4999个请求,然后第60秒又1毫秒接受了一个新的请求 **由于满足了: 当前系统时间 > 上次重置时间 + 时间间隔** 被重置了rate,然后第61秒又进来4999个请求,那么在10:00:59 ~ 10:01:02这3秒收到了4999*2个请求,也是远大于设定的5000。 因此,对令牌桶算法的实现,无论是dubbo自己的实现方式还是通过调度的方式,并不能保证任意时间窗口处理的请求数是设定的值。因为令牌桶算法的特点之一是允许某种程度的突发传输,如果要实现任意1秒内限制5000请求,一是可以通过设定interval=500ms,rate=2500,这样可以准确地保证任意2个interval之内,能够处理的总量最大是2*rate;二是采用漏桶算法,该算法可以实现处理请求速率的均匀。 [ Full content available at: https://github.com/apache/incubator-dubbo/issues/2345 ] This message was relayed via gitbox.apache.org for [email protected]
