令牌桶算法被大家所熟识,这里就不再展开介绍。令牌桶遇到配置调整可以通过粗暴的重启来完成,本文提供一个热调整算法。
所谓令牌桶调整,比如一个配置了10s内上限100的令牌桶(与“每0.1秒发一个令牌,桶上限100”这种配置形式是等价的),可以调整其时间长度或令牌上限。
最简单的调整方法,就是改变令牌派发的时间间隔和上限,但会有冷启动问题,即实际观察到的伸缩效果会延后。改进这一点要在调整时直接改变令牌桶中剩余令牌的数额来实现,下面具体介绍这个办法。
在一个令牌发放周期(有些令牌桶实现中并没有周期的设置)中:
T 表示周期时长
Q 表示周期内派发令牌数
t 表示相对周期开始的时间
P 表示投放令牌速率,为T/Q
N 表示桶里剩余可用令牌数
那么,已发放令牌数为Q*t/T
,待发放令牌为Q*(T-t)/T
当扩张令牌桶(增大Q)时,则是透支一部分待发放令牌直接放入桶中,令 N'=N+X*(Q'-Q)*(T-t)/T
,X为透支系数,透支部分要在投放中偿还,即P'=P*((1-X)*(Q'-Q)+Q)/Q
,至周期结束时恢复P'=T/Q'
当缩小令牌桶时,同理存在一个存量扣除系数Y,令N'=N-Y*(Q-Q')*(T-t)/T
,P'=P*((1-Y)*(Q'-Q)+Q)/Q
,同样至周期结束时恢复P'=T/Q'
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。