限流算法详解:从计数器到令牌桶的实践与对比
在高并发场景中,限流是保护系统稳定的关键手段,通过限制单位时间内的请求量,避免服务因过载而崩溃。常见的限流方案包括计数器算法、漏桶算法和令牌桶算法,每种算法适用于不同的业务场景,各有优劣。
计数器算法:简单直观的流量控制
计数器算法是最基础的限流方式,通过统计单位时间内的请求数,超过阈值则拒绝新请求。分为固定窗口和滑动窗口两种实现。
1. 固定窗口计数器(Fixed Window)
原理
- 将时间划分为固定长度的 “窗口”(如 1 秒),维护一个计数器;
- 每个请求进入时,计数器加 1;若计数器超过阈值(如 100 次 / 秒),则拒绝请求;
- 窗口结束时,计数器重置为 0。
示例
- 阈值:100 次 / 秒,窗口大小 1 秒;
- 第 0-1 秒内,若请求达 100 次,后续请求被拒绝;
- 第 1 秒结束,计数器重置,第 1-2 秒重新计数。
优缺点
- 优点:实现简单(如用 Redis 的
INCR+EXPIRE即可); - 缺点:存在 “窗口边界” 问题,可能出现突发流量。例如:
- 第 0.9 秒内收到 99 次请求,第 1.1 秒内又收到 99 次请求;
- 两个窗口均未超限,但 200ms 内总请求达 198 次,可能压垮服务。