一口气讲懂常见限流算法

116 阅读3分钟

1. 固定窗口算法(Fixed Window)

怎么理解?

把时间按段切,比如每分钟一段,只统计当前这一分钟的请求数。

举个例子:

你开了一个网红奶茶店,规定每分钟最多接待10个顾客。不管他们什么时候来,只要这一分钟内超过10个,第11个就被挡在门外。

  • 比如:10:00:00 到 10:00:59 进来了10个人,第11个人只能等到10:01:00再进。

优点:

  • 实现简单,性能好(计数器 + 当前窗口时间即可)
  • 很适合每秒、每分钟那种定量控制场景

缺点:

  • 边界突发,比如 10:00:59 来10个,10:01:00又来10个,就变成1秒内来了20个,系统有可能扛不住(容易“抖动”)

2. 滑动窗口算法(Sliding Window)

怎么理解?

也是按时间统计,但窗口会“滑动”。比如当前是 10:01:30,就统计过去60秒内的请求数,而不是固定每分钟。

举个例子:

你给奶茶店加了个自动检测系统:每隔1秒查一次,过去60秒里来了多少人。超过限额就暂时不让新顾客进门。

  • 比如现在是10:01:30,它会统计 10:00:31 到 10:01:30 的总请求数

优点:

  • 更平滑,不会像固定窗口那样在边界抖动
  • 限流更精准,系统更稳定

缺点:

  • 实现复杂,通常要存储一段时间内的请求记录(比如用时间戳+滑动数组)
  • 性能开销比固定窗口高些

3. 令牌桶算法(Token Bucket)

怎么理解?

系统像一个水桶,每隔一段时间往里放几个“令牌”。请求来了要“拿令牌”,没有令牌就得等。

举个例子:

你给奶茶店准备了限量优惠券,每分钟发10张。顾客来消费必须出示优惠券,没券就等下分钟。券可以先攒着,下次人多也能应对一下。

  • 一分钟发10张,如果没人来,券就会积攒在桶里
  • 一下来了20人,只要有足够券,就能放过去

优点:

  • 能应对突发流量(桶里可能存了以前没用完的令牌)
  • 灵活,有“备用容量”

缺点:

  • 实现稍微复杂点,要模拟“发放”和“消耗令牌”
  • 控制不如漏桶严格,可能短时间内通过很多请求

4. 漏桶算法(Leaky Bucket)

怎么理解?

也是一个桶,不过这回是“漏水”的桶。水(请求)进来之后,每秒只能漏固定速率,多了就排队,排满了就直接丢掉。

举个例子:

奶茶店只配了一个店员,每分钟最多做5杯奶茶。顾客来得再快,也得排队一个个做,多的顾客就被劝退。

  • 就算一下来了20人,你也只能慢慢漏出去处理,系统不会被压垮
  • 排队的人太多,队满了,后面的人只能走了

优点:

  • 控制很严格,请求处理速率恒定,不会突发
  • 系统更稳,防止过载

缺点:

  • 对突发流量不友好,容易排队甚至丢弃请求
  • 用户体验可能不太好,等太久就被拒绝