令牌桶与漏桶

Categories:

令牌桶和漏桶是常用的流量整形算法,具体来说,它们可以限制数据传输的速率,避免网络拥塞和资源浪费。 两者的使用场景和实现机制有所不同。

令牌桶

令牌桶(Token Bucket)是一种流量整形算法,通过维护一个固定容量的令牌桶,以一定的速率往桶中添加令牌,服务请求则需要等待令牌池中有令牌才能被处理。 当令牌桶满时,多余的令牌会被丢弃。每个请求在处理之前先从令牌桶中获取一个令牌,如果没有获取到,则该请求会被缓存或者拒绝。 这种算法主要用于限制请求速率,确保网络和服务不会因为短时间内突发流量而过载。

漏桶

漏桶(Leaky Bucket)也是一种流量整形算法,不同于令牌桶先行保存令牌,漏桶采取的是先将请求放到一个缓冲区(即“桶”)中,随后按照固定的速率处理请求。 漏桶有一个固定的容量,当请求的数量超过容量时,超出部分将被丢弃。漏桶主要用于限制输出速率,避免传输数据时对网络的冲击。

令牌桶漏桶
优点令牌桶可以平滑地控制请求速率,避免了短时间内的流量峰值,提高了系统的稳定性。令牌桶的算法相对简单,可以实现较高的性能,适用于高并发场景。漏桶所处理的请求速率是固定的,不会出现突发流量,可以平滑地控制网络的性能。
缺点只能限制请求速率只能限制输出速率,不能限制输入速率
使用场景控制应用程序向其他系统发送数据量的速率。 控制网络上传输速率。 对于直播等带宽受限业务,可以通过令牌桶算法来平滑限制用户观看视频的码率和分辨率。对于需要限制客户端的请求的输出速率的场景,采用漏桶算法可以平滑地控制输出速率,保护服务器性能。 限制网络上传输速率。

从实现机制上看,在令牌桶中,令牌被保存在一个令牌池中,每个请求需要先获取到令牌后才能处理; 而在漏桶中,请求被保存在一个缓冲区中,随后按照固定的速率处理请求。

从使用场景上来看,令牌桶更适用于对请求速率进行限制的场景,可以帮助平滑地减缓短时间内的流量峰值; 而漏桶算法更适用于限制输出速率的场景,可以帮助平滑地控制网络性能。

大白话

林师傅和楼师傅都是卖煎饼果子的,每分钟做一个。

林师傅推了个小推车,不提供座位。不管有没有人买,都先做着一些备用,准备了个小篮,最多存放10个煎饼果子。 楼师傅有个小门店,有人下单才开干,没人买自己就歇着,客人来了就先坐着等,门店最多坐10个人。

如果现在突然来了20个客人,对第11-20个客人,林师傅和楼师傅都只能抱歉地说,人太多了,得【站】着等一会。 但对于第1-10个客人来说,林师傅可以立马交货。 而楼师傅因为是现做的,第2个客人都得等2分钟,第10个客人需要足足等10分钟。

如果你觉得本文对你有帮助或不错,可略表心意,请我喝一杯冰可乐。

Comments