限流算法(高并发)

本文介绍了常见的限流算法,包括令牌桶、漏桶、计数器和滑动窗口算法。令牌桶允许一定程度的突发流量,按照固定速率添加令牌,而漏桶则以恒定速率流出请求,平滑突发流量。计数器用于限制并发数,滑动窗口算法解决了计数器的临界问题。通过对比,我们可以看到两种算法在处理流量控制上的不同策略。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

常见的限流算法有:令牌桶、漏桶,计数器,滑动窗口算法也可以用来进行粗暴限流实现

令牌桶算法

令牌桶算法,是一个存放固定容量令牌的桶,按照固定速率网桶里添加令牌。

令牌桶算法描述如下:

1.假设限制2r/s,则按照500毫秒的固定速率往桶中添加令牌。

2.桶中最多存放b个令牌,当桶满时,新添加的令牌被丢弃或拒绝。

3.当一个n个字节大小的数据包到达,将从桶中删除n个令牌,接着数据包被发送到网络上。

4.如果桶中的令牌不足n个,则不会删除令牌,且该数据包将被限流(要么丢弃,要么在缓冲区等待)

漏桶算法

漏桶作为计量工具时,可以用于流量整形和流量控制。

漏桶算法的描述如下:

1.一个固定容量的漏桶,按照常量固定速率流出水滴。

2.如果桶是空的,则不需要流出水滴。

3.可以以任意速率流入水滴到漏桶。

4.如果流入水滴超出了桶的容量,则流入的水滴溢出了(被丢弃),而漏桶容量是不变的。

计数器算法

使用计数器进行限流,主要限制总并发数,比如数据库连接池大小、线程池大小、秒杀并发数都是计数器的用法。只要全局总请求数或者一定时间段的总请求数达到设定的阈值,则进行限流。这种方式是简单粗暴的总数量限流,而不是平均速率限流

滑动窗口算法

为了解决计数器算法带来的临界问题,所以引入额滑动窗口算法
TCP网络通信协议中,就采用了滑动窗口算法来解决网络拥塞的情况

原理:在固定窗口中分割出来多个小时间窗口,分别在每个小时间窗口中记录访问次数,然后根据时间将窗口往前滑动并删除过期的小时间窗口。最终只需要统计滑动窗口范围内的所有小时间窗口总的技术即可

令牌桶和漏桶算法对比

1.令牌桶是按照固定速率往桶中添加令牌,请求是否被处理需要看桶中令牌是否足够,当令牌数减为零时,则拒绝新的请求。漏桶则是按照常量固定速率流出请求,流入请求速率任意,当流入的请求数累积到漏桶容量时,则新流入的请求被拒绝。

2.令牌桶限制的是平均流入速率(允许突发请求,只要有令牌就可以处理,支持一次拿3个令牌,或4个令牌),并允许一定程度的突发流量。

3.漏桶限制的是常量流出速率(即流出速率是一个固定常量值,比如都是1的速率流出,而不能一次是1,下次又是2),从而平滑突发流入速率。

4.令牌桶允许一定程度的突发,而漏桶主要目的是平滑流入速率。两个算法实现可以一样,但是方向是相反的,对于相同的参数得到的限流效果是一样。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Java Abe

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值