高并发限流方案
1. nginx
2. 网关
3.代码层级
3.1. 计数器限流(固定窗口)
原理:统计单位时间内的请求数,超过阈值则拒绝请求。
实现:
使用原子计数器(如 Redis INCR + EXPIRE)。
例如:1 秒内限制 1000 次请求。
优点:简单高效。
缺点:窗口临界问题(如第 1 秒末和第 2 秒初的突发请求可能双倍通过)。
工具:Redis、Guava AtomicLong。
3.2. 滑动窗口限流
原理:将固定窗口细分为多个小窗口(如 1 秒分为 10 个 100ms 窗口),统计最近 N 个小窗口的总请求。
优点:缓解临界问题,更平滑。
缺点:仍有一定时间粒度误差。
工具:Redis + Lua(维护时间戳队列)、Sentinel。
3.3. 漏桶算法(Leaky Bucket)
原理:以恒定速率处理请求(如每秒 10 次),超出桶容量的请求被丢弃/排队。
实现:队列 + 固定速率消费。
优点:绝对平滑,适合流量整形。
缺点:无法应对突发流量(即使系统有空闲资源)。
工具:消息队列(如 RabbitMQ)、Nginx limit_req(漏桶变种)。
3.4. 令牌桶算法(Token Bucket)
原理:系统以固定速率向桶中添加令牌,请求需获取令牌才能执行,否则被限流。
优点:允许突发流量(如短时间内消耗积压的令牌)。
缺点:实现略复杂。
工具:
Guava RateLimiter(单机)。
Redis + Lua(分布式,如 redis.call(‘incr’, KEYS[1]) 结合过期时间)。
3.5. 分布式限流
场景:多节点环境下全局限流。
实现:
Redis + Lua:原子操作统计集群请求量。
中间件:如 Sentinel、Nginx 集群限流。
注意点:需处理 Redis 网络延迟和一致性。