漏桶算法可以保证流量稳定,令牌桶支持突发性能。
漏桶算法 leaky bucket
系统的请求都会放入漏桶内,漏桶以固定的速率处理请求。漏桶有固定的大小,当请求过快/多时,会溢出漏桶,即丢弃不处理。
令牌桶算法 token bucket
为生产者/消费者模型:
- 生产者:系统以固定的速度向令牌桶内放令牌,如果令牌桶内令牌满了,则丢弃令牌;
- 消费者:收到请求后,从令牌桶内取出令牌,如果桶内没有令牌了,就拒绝请求,或着将请求放入等待队列,下个周期获得令牌后,主动消耗等待队列中的请求。
令牌桶支持burst流量,上一个限速周期没有用完的令牌,可以留在后续限速周期使用。在实际应用中,需要设置burst的最大值,来保证突发流量不会太大。
周期:即放令牌的固定速度,一般会将一秒钟分为若干个时间片,一个时间片向桶内放可配置数量的令牌。
在一个周期内,使用量不超过一个周期能产生的最大令牌数+剩余令牌数。
*一种burst限速方法
假定某种条件A,默认限速值t。
如果当前限速周期内没有触发条件A,则将限速值 t 提高固定比例 r /数值 s(tn = t+t*r / t+s);直到某个周期内触发了条件B,就将限速值降低固定比例 r1 /数值 s1,直到到达限速下限。
参考: