高并发限流方案

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 网络延迟和一致性。

你可能感兴趣的:(高并发限流方案)