漏桶和令牌桶的区别

本文介绍了漏桶和令牌桶两种流量控制算法。漏桶算法以固定速率处理请求,超出则拒绝,适合平滑突发流量;令牌桶则允许在限制平均速率的同时处理突发流量。两者的区别在于,漏桶无法有效利用资源,而令牌桶能适应突发流量。在实际应用中,两者常结合使用以实现更高效的流量控制。

一、漏桶

把请求比作是水,请求进桶里,但是不处理,并以限定的速度出水,出水就相当于处理请求。像一个死板的流水线。传送带的速度是固定的,无论前面的工序做得多快,产品都只能一个一个地按固定速度流向下一环节,保证了后续环节的稳定。

1、流入:请求到达后先进入桶中。
2、流出:桶以一个恒定的速率(比如每秒2个请求)漏出请求进行处理。这个流出速率是固
定的,与请求进入的速率无关。
3、桶满:如果流入的速率超过流出的速率,桶就会开始积水。当水超过桶的容量时,新的请求
就会被丢弃或拒绝。

使用场景案例

1、保护下游系统:在一个微服务架构中,一个服务A调用服务B。服务B的处理能力很弱,
每秒只能处理5个请求。我们可以在服务A调用服务B之前加一个漏桶,严格限制每秒最多5个
请求发给服务B,从而保护服务B不被压垮。这里的重点是“平滑”,即使服务A瞬间收到10个
请求,漏桶也只会以恒定的每秒5个的速率发给服务B2、消息队列的消费者:确保从消息队列(如RabbitMQKafka)中取出消息的速率是
固定的,防止消费者处理不过来导致崩溃。

二、令牌桶

令牌桶算法的原理是系统会以一个恒定的速度往桶里放入令牌,而如果请求需要被处理,则需要先从桶里获取一个令牌,当桶里没有令牌可取时,则拒绝服务。像一个慷慨的老板。他给你规定了一个长期的预算(平均速率),但如果你之前省着用,他允许你某个月一次性花掉攒下的钱(突发流量)

使用场景案例

1、API网关限流:比如一个开放API,为了公平使用,限制每个用户每秒最多100次调用。
但如果用户在前一秒没怎么用,桶里攒下了很多令牌,下一秒他突然需要发起150次请求,
令牌桶算法可以允许这次“突发”,让150个请求中的前(100 + 之前剩余的令牌数)个请求立
即通过。这更符合实际业务场景,用户体验更好。
2、网络流量整形:允许主机在长时间空闲后突然发送大量的数据包(突发传输),但长期平均
速率不超过限制。

三、区别

漏桶:如果一下子来了很多请求,但是请求会被放在池子里面,然后以固定的速率去处理请求。

令牌桶:以固定的速率往桶内放入令牌,一下来很多请求,只要桶内的令牌足够多,请求就会立马被处理,这就是允许突发大量请求进来。

漏桶是请求进入桶内,但是处理请求的速率是固定的,令牌桶是只要拿到令牌请求立马会被处理。

漏桶算法与令牌桶算法的区别在于,漏桶算法能够强行限制数据的传输速率,令牌桶算法能够在限制数据的平均传输速率的同时还允许某种程度的突发传输。

需要注意的是,在某些情况下,漏桶算法不能够有效地使用网络资源,因为漏桶的漏出速率是固定的,所以即使网络中没有发生拥塞,漏桶算法也不能使某一个单独的数据流达到端口速率。因此,漏桶算法对于存在突发特性的流量来说缺乏效率。而令牌桶算法则能够满足这些具有突发特性的流量。通常,漏桶算法与令牌桶算法结合起来为网络流量提供更高效的控制。

举个栗子:

比如说存在两个系统A、B,公用一个网络,网络带宽为2M, A、B各分得1M,此时通过漏桶算法控制两个系统使用网络的速率,A、B系统使用网络的速率固定最大值为1M,无论A、B系统接受多少流量,但流出的速率都限制在最大1M,当网络中没有发生拥塞,也就是可能出现B系统可能空闲没有使用网络,对应分给B系统的1M带宽是空闲的,而A系统这一时刻接收了5M的流量,由于漏桶限流的存在,A只能使用1M带宽,我们的带宽有2M,此刻我们只能使用1M,也就是达不到带宽的最大速率,另外1M带宽是浪费的,因此不能充分利用,缺乏效率;当然从另一方面来讲也带来了好处,就是隔离性,A系统无论收到多大的流量冲击,对于B系统的无感的,不会因为流量冲击A,而B受到影响

令牌桶算法能够在限制数据的平均传输速率的同时还允许某种程度的突发传输。

本文转载:https://www.jianshu.com/p/c6b20845561a

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值