限流算法

102 阅读4分钟

1、概述

限流算法:在分布式系统中对请求进行控制和调节的一种技术手段,其目的是保护系统不受过载而导致的性能下降甚至崩溃。

限流相关概念:

  • QPS:Queries Per Second,单位时间内可以处理的请求数量。
  • 并发连接数:系统同时处理的连接数量。
  • 排队::将请求放入等待队列中,来处理突发流量,避免系统瞬间请求压力过大。

2、令牌桶算法

令牌桶算法:维护一个令牌桶,每个令牌表示一个请求的许可。令牌以固定的速率往桶中填充,每当有请求到来时,系统会尝试从桶中获取一个令牌,如果成功则允许请求通过,否则拒绝。

令牌桶算法大致流程:

  1. 令牌以某个固定的速率向令牌桶中添加令牌。
  2. 令牌容量是固定的,但是放行速度不是固定的。
  3. 只要桶中还有剩余令牌,请求过来就可以申请成功,然后放行。
  4. 如果桶中没有剩余令牌,请求过来就会被拒绝。

令牌桶限流原理图:

image.png

3、漏桶算法

漏桶算法:类似于一个漏斗,请求被视为水滴,系统以固定的速率将水滴从漏斗中释放,而请求到来时则会添加水滴。如果漏桶已满,则新的请求将被拒绝。

漏桶算法与令牌桶算法前面部分类似,但操作对象不同,令牌桶是将令牌放入桶中,漏桶是将访问请求放到桶中。漏桶算法后面部分是以一个恒定的速率将请求从桶中流出进行处理。

漏桶算法原理图:

image.png

令牌桶 & 漏桶对比:

对比项令牌桶漏桶
请求处理速率不固定固定
适合场景平滑处理突发流量稳定处理请求

4、计数器算法

计数器算法:统计单位时间内的请求次数,并与预设的阈值进行比较。当请求次数超过阈值时,系统开始拒绝新的请求。

基本原理:

  1. 计数器:维护一个计数器,用于记录单位时间内到达的请求数量。
  2. 限流阈值:设定一个阈值,表示单位时间内允许处理的最大请求数量。
  3. 时间窗口:将时间划分为固定的时间窗口,如每秒一个窗口。
  4. 请求处理:每当有请求到达时,将计数器加一,如果计数器未达到阈值,则正常处理,否则,拒绝请求。
  5. 计数器清零:当前时间窗口结束,则将计数器清零。

存在问题:

  1. 不适合处理突发流量,无法应对短时间内的请求高峰。
  2. 容易受到恶意请求攻击,如短时间内发送大量请求绕过限流。

应用场景:适合对单位时间内的请求量有明确限制要求的场景,如API接口限流、网络服务器限流等。

5、滑动窗口算法

滑动窗口算法:将请求的时间戳放入一个滑动窗口中,并统计窗口内的请求数量。随着时间的推移,旧的时间戳将被移出窗口,新的时间戳将被加入。通过动态调整窗口大小和时间间隔,可以更精细地控制请求的限流。

基本原理:

  1. 时间窗口:将时间划分为固定长度的时间窗口,例如每秒一个窗口。
  2. 计数器队列:维护一个长度为窗口数的计数器队列,用于记录每个时间窗口内的请求数量。
  3. 限流阈值:设定一个阈值,表示每个时间窗口内允许处理的最大请求数量。
  4. 请求处理:每当有请求到达时,将当前时间窗口的计数器加一。
  5. 限流判断:该时间窗口的计时器达到了该时间窗口的限流阈值,则进行限流。
  6. 调整窗口:当时间窗口过时,则将该时间窗口退出,并加入新的时间窗口,动态计算该时间窗口的限流阈值。

基本原理图:

image.png