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人,你也只能慢慢漏出去处理,系统不会被压垮
- 排队的人太多,队满了,后面的人只能走了
优点:
- 控制很严格,请求处理速率恒定,不会突发
- 系统更稳,防止过载
缺点:
- 对突发流量不友好,容易排队甚至丢弃请求
- 用户体验可能不太好,等太久就被拒绝