一、漏桶算法 Leaky Bucket
核心特征
请求流入速度不限,服务处理速度强制恒定 ,削峰能力极强,不支持突发流量。
适用场景
- 保护下游第三方服务、外部接口 比如调用第三方支付、短信、物流 API,对方明确限制每秒只能处理 20 次,不能瞬时并发打爆下游。 无论前端瞬间涌来多少请求,统一匀速发出去,平稳下游负载。
- 爬虫、数据同步任务 批量爬取网站数据,匀速发起请求,避免短时间大量请求触发网站反爬封禁。
- 消息队列消费限速 MQ 消费端控制消费速率,防止数据库瞬时大量写入压垮 DB。
不适合
业务有突发流量需求(秒杀、活动短时间大量用户),会大量拒绝请求,用户体验差。
二、令牌桶算法 Token Bucket(互联网最通用)
核心特征
匀速生成令牌,空闲时可累积令牌,允许短时突发流量,平均 QPS 可控。
适用场景
- 网关接口限流(Gateway/Sentinel/Guava RateLimiter) 绝大多数业务后台、HTTP 接口、微服务统一限流。 平时低峰积攒令牌,活动瞬间大量请求可以一次性放行,兼顾吞吐量与防护。
- 秒杀、营销活动、短时间流量突增场景 活动开启瞬间涌入大量用户,需要短暂放行峰值流量,不用全部拦截。
- 单机本地限流 接口单机并发控制,简单易实现,无需额外中间件。
不适合
严格要求输出流量绝对平稳、完全不允许突发的第三方调用场景。
三、滑动时间窗口算法 Sliding Window
核心特征
滚动统计周期内总请求量,解决固定窗口临界双倍流量击穿问题,统计精度最高。
适用场景
- 防刷、风控类高频限制 登录、验证码、短信、下单接口,限制「1 分钟最多 5 次」这类频次控制。 固定窗口会出现窗口临界点流量翻倍,滑动窗口可以精准拦截刷接口行为。
- 精细化 QPS 统计、计费统计 按量计费 API、监控大盘统计流量,需要精准统计一段时间内真实访问总量。
- 分布式限流(Redis+Lua) 分布式环境下基于时间分片实现滑动窗口,精准控制全集群总访问量。
- 高频短周期限制 如 10 秒、1 分钟内请求上限,对限流精度要求高的业务。
不适合
需要平滑流量输出、单纯控制处理速率的场景(不如漏桶);单纯应对突发流量场景(不如令牌桶简单高效)。
令牌桶场景通俗分析
令牌桶关键两点:
- 令牌匀速产生(控制平均 QPS,保证长期不会压垮服务)
- 没人请求时令牌会攒起来,瞬间来了大量请求可以一次性消费攒下的令牌 → 支持突发流量
1. 为什么普通业务接口首选令牌桶?
举个电商首页接口例子:
- 配置:每秒生成 100 个令牌,桶最大容量 300
- 平时凌晨低峰:每秒只有 20 个请求,每秒消耗 20 令牌,剩下 80 个慢慢存进桶里
- 早上 8 点流量高峰瞬间涌入 250 个请求: 桶里已经攒了几百个令牌,一次性放行 250 个,不会直接拦截用户; 高峰过后,又会慢慢恢复匀速生成,长期平均流量依然控制在 100QPS。
如果换成漏桶:处理速度固定 100,瞬间 250 请求直接拦截 150 个,大量用户报 "访问频繁",体验很差。
2. 场景 1:营销活动、秒杀(最典型)
活动开抢一瞬间,几千人同时点下单,属于典型突发流量。
- 令牌桶:活动前半小时低峰,桶存满令牌,开抢瞬间一次性放行大量请求,承接峰值;
- 长期平均速率限制住,不会让系统持续高负载; 漏桶做秒杀会疯狂拒绝用户,业务不能接受。
3. 场景 2:微服务网关统一限流(Spring Cloud Gateway、Sentinel)
网关是所有接口入口,大部分业务都存在高低峰差异: 白天流量高、深夜流量极低。 深夜空闲时令牌持续积累,第二天早高峰可以承接短时爆发,兼顾系统安全和用户体验,这是线上最普遍的用法。
4. 场景 3:单机本地限流(Guava RateLimiter 底层就是令牌桶)
后台导出、批量查询接口: 平时没人导出,令牌攒着; 某天运营一次性导出上百条数据,短时放行,不会直接限流报错。
5. 什么场景不适合令牌桶?
对接第三方接口(短信、支付、物流),对方明确要求每秒最多 20 次,完全不允许突发。 比如第三方接口限制 20QPS,你桶里攒了 100 令牌,一瞬间发 100 条请求,直接被对方封 IP。 这种场景必须用漏桶,强制匀速输出。
极简总结令牌桶适用逻辑
只要你的业务满足: 长期要控制平均流量,但短时间允许一波峰值、不想粗暴拦截用户 就用令牌桶。 绝大多数互联网普通业务、活动、网关都符合这个需求,所以令牌桶是使用最广的限流算法。
场景速查表
| 算法 | 核心优势 | 典型落地场景 | 不推荐场景 |
|---|---|---|---|
| 漏桶 | 流量绝对匀速、强削峰 | 第三方接口调用、爬虫、MQ 消费限速 | 秒杀、活动突发流量 |
| 令牌桶 | 支持突发、实现简单、平衡吞吐 | 微服务网关、普通业务接口、单机限流 | 下游严格禁止瞬时并发 |
| 滑动窗口 | 统计精准、无临界流量漏洞 | 验证码 / 登录防刷、分布式限流、计费统计 | 单纯流量整形、匀速输出场景 |
总结
漏桶与令牌桶兼顾平稳性,且令牌桶还有突发处理性;而滑动窗口只适合精准防刷。
- 想匀速保护下游 → 漏桶
- 普通业务、允许短时突发 → 令牌桶**(首选)**
- 做频次风控、精准计数防刷 → 滑动窗口