分布式限流算法是应对高并发流量的关键技术,本文深度解析4种主流方案:固定窗口计数器简单但存在边界问题,滑动窗口计数器更精准但消耗内存,令牌桶算法支持突发流量(如Sentinel实现),漏桶算法保证恒定处理速率。对比各算法优缺点,结合实际场景给出选型建议,包括Redis+Lua实现、动态阈值调整等生产环境最佳实践,帮助开发者构建高可用分布式系统,解决秒杀、大促等流量洪峰问题,提升系统稳定性与面试竞争力。
作为程序员,经常被面试官问:"分布式系统如何应对突发流量?" 今天咱就唠唠常见的分布式限流算法,结合实际场景比较它们的优缺点。
在分布式系统中,单节点限流(如Nginx)扛不住跨服务调用。比如双十一秒杀,流量瞬间打爆服务节点——限流算法就是系统的"保险丝",防止雪崩。
图:流量洪峰示意图
原理:每1秒统计请求数,超过阈值就拒绝。
✅ 优点:Redis的INCR
就能实现,简单粗暴。
❌ 缺点:窗口边界突发流量可能超载。比如0.9秒时涌进100个请求,1.1秒又涌进100个,实际0.9-1.1秒的200请求会压垮系统。
原理:把1秒拆成10个100ms小窗口,统计连续N个小窗口的请求和。
✅ 解决固定窗口的边界问题
❌ 内存消耗高(需存储多窗口数据),适合Redis + Lua实现
graph LR
A[请求进入] --> B{当前小窗口计数+1}
B --> C[统计最近10个窗口总和]
C --> D{>阈值?}
D -->|是| E[拒绝]
D -->|否| F[通过]
原理:系统以固定速率向桶里放令牌,请求需抢到令牌才能通过。
✅ 允许突发流量(桶内有存量令牌)
✅ Guava RateLimiter、Sentinel都在用
❌ 分布式场景需用Redis + Lua保证原子性
原理:请求像水一样流入漏桶,桶以恒定速率出水(处理请求)。
✅ 绝对平滑流量
❌ 突发流量时延迟高(需排队)
❗️对比令牌桶:漏桶控制处理速率,令牌桶控制请求速率
图:令牌桶 vs 漏桶
| 算法 | 适用场景 | 开源实现 | |---------------|----------------------------|-----------------------| | 固定窗口 | 对精度要求低的简单场景 | Redis INCR | | 滑动窗口 | 需要精度控制的中小型系统 | Redis + Lua | | 令牌桶 | 允许突发流量的大促场景 | Sentinel/Resilience4j | | 漏桶 | 需要恒定处理速率的计费系统 | Nginx限流模块 |
图:限流组件集成架构
面试突击福利:
→ 2025 Java面试宝典(独家整理)
提取码: 9b3g
(网盘链接使用蓝色字体)
需要买面试鸭会员?通过面试鸭返利网找我可返25元,实测省下一顿午饭钱!
本文手撕了4种分布式限流算法的比较,搞懂这些,面试官问你"如何设计秒杀系统"时,限流模块就能稳拿分了!
扫码联系我返利
(当前返利8元,金额随官方实际价格波动,最好提前咨询)
面试鸭小程序码
美团大额优惠券,给自己加个鸡腿吧!
今日有支付宝大红包赶快领,手慢无
支付宝扫码领取1-8元无门槛红包