跳至主要內容

4.3.2 限流算法


网络限流算法

网络限流算法用于控制系统的流量,防止系统被过多的请求压垮,保障系统的稳定性和可靠性。以下是一些常见的网络限流算法:

  1. 令牌桶算法(Token Bucket):令牌桶算法维护一个令牌桶,每当有请求到达时,会尝试从桶中获取令牌,如果桶中有足够的令牌,则允许请求通过,并消耗相应数量的令牌;如果桶中没有足够的令牌,则拒绝请求或者将请求放入队列中等待。令牌桶算法可以平滑地控制请求的到达速率。

  2. 漏桶算法(Leaky Bucket):漏桶算法维护一个固定容量的漏桶,每当有请求到达时,会尝试向漏桶中添加请求的数量,如果漏桶已满,则拒绝请求;如果漏桶未满,则允许请求通过,并以固定的速率从漏桶中消耗请求。漏桶算法可以平滑地控制请求的发送速率。

  3. 计数器算法(Count-based Algorithm):计数器算法通过统计一定时间窗口内的请求数量来限制流量。可以设置一个阈值,当请求到达时,如果当前时间窗口内的请求数量已经达到了阈值,则拒绝请求;否则允许请求通过。计数器算法简单直接,但可能会出现突发流量的问题。

  4. 漏斗算法(Funnel Algorithm):漏斗算法类似于令牌桶算法,但是允许短时间内的突发流量。漏斗算法维护一个漏斗,每当有请求到达时,会尝试向漏斗中注水,如果漏斗溢出则拒绝请求,否则允许请求通过,并以固定速率从漏斗中排水。漏斗算法可以平滑地控制请求的到达速率,并允许一定程度的突发流量。

  5. 令牌桶 + 漏桶组合算法:将令牌桶算法和漏桶算法结合使用,既可以平滑地控制请求的到达速率,又可以应对突发流量。

计数器算法

规定在1分钟内访问接口次数不能超过1000个,设置一个计数器,对固定时间窗口1分钟进行计数,每有一个请求,计数器就+1,如果请求数超过了阈值,则舍弃该请求,当时间窗口结束时,重置计数器为0。

【图片】

计数器算法虽然简单,但是有临界问题。假设有一个用户在0:59时,瞬间发送了1000个请求,并且1:01又发送了1000个请求,那么其实用户在 2秒里面,瞬间发送了2000个请求。用户在时间窗口的重置节点处突发请求, 可以瞬间超过速率限制,压垮应用。

参考

https://www.zhihu.com/question/483788010/answer/2907703738open in new window

上次编辑于: