并不能说明令牌桶一定比漏洞好,她们使用场景不一样。令牌桶可以用来保护自己,主要用来对调用者频率进行限流,为的是让自己不被打垮。所以如果自己本身有处理能力的时候,如果流量突发(实际消费能力强于配置的流量限制),那么实际处理速率可以超过配置的限制。而漏桶算法,这是用来保护他人,也就是保护他所调用的系统。主要场景是,当调用的第三方系统本身没有保护机制,或者有流量限制的时候,我们的调用速度不能超过他的限制,由于我们不能更改第三方系统,所以只有在主调方控制。这个时候,即使流量突发,也必须舍弃。因为消费能力是第三方决定的。
总结起来:如果要让自己的系统不被打垮,用令牌桶。如果保证被别人的系统不被打垮,用漏桶算法。
令牌桶算法:
突发时间 x 令牌产生速率+令牌上限=突然流量x突然时间
一个6Mb/s的网络中有一台由令牌桶算法控制的计算机。令牌桶以1Mb/s的速率注入,其容量为8Mb,最初令牌桶就是满的。问该计算机能以6Mb/s的速率全速传送多长时间?
假设 s1 突然时间
8+s1 x 1 = 6 x s1
s1=8/5
s1=1.6
假设 s1 突然时间
2 X s1 + 6 = 10 X s1
s1= 6/8=0.75(s)
突然之后,还剩32.5数据没用传输
40-0.75X10=32.5Mbits
以10Mbps突然之后,在突然时间之后,就以为令牌到达速率传输,俗称慢速
s2=32.5/2=16.25(s)
总时间S= s1+s2 = 0.75+16.25 =17(s)