漏桶、令牌桶、滑动窗口 三限流算法理解

一、漏桶算法 Leaky Bucket

核心特征

请求流入速度不限,服务处理速度强制恒定 ,削峰能力极强,不支持突发流量

适用场景

  1. 保护下游第三方服务、外部接口 比如调用第三方支付、短信、物流 API,对方明确限制每秒只能处理 20 次,不能瞬时并发打爆下游。 无论前端瞬间涌来多少请求,统一匀速发出去,平稳下游负载。
  2. 爬虫、数据同步任务 批量爬取网站数据,匀速发起请求,避免短时间大量请求触发网站反爬封禁。
  3. 消息队列消费限速 MQ 消费端控制消费速率,防止数据库瞬时大量写入压垮 DB。

不适合

业务有突发流量需求(秒杀、活动短时间大量用户),会大量拒绝请求,用户体验差。

二、令牌桶算法 Token Bucket(互联网最通用)

核心特征

匀速生成令牌,空闲时可累积令牌,允许短时突发流量,平均 QPS 可控。

适用场景

  1. 网关接口限流(Gateway/Sentinel/Guava RateLimiter) 绝大多数业务后台、HTTP 接口、微服务统一限流。 平时低峰积攒令牌,活动瞬间大量请求可以一次性放行,兼顾吞吐量与防护。
  2. 秒杀、营销活动、短时间流量突增场景 活动开启瞬间涌入大量用户,需要短暂放行峰值流量,不用全部拦截。
  3. 单机本地限流 接口单机并发控制,简单易实现,无需额外中间件。

不适合

严格要求输出流量绝对平稳、完全不允许突发的第三方调用场景。

三、滑动时间窗口算法 Sliding Window

核心特征

滚动统计周期内总请求量,解决固定窗口临界双倍流量击穿问题,统计精度最高。

适用场景

  1. 防刷、风控类高频限制 登录、验证码、短信、下单接口,限制「1 分钟最多 5 次」这类频次控制。 固定窗口会出现窗口临界点流量翻倍,滑动窗口可以精准拦截刷接口行为。
  2. 精细化 QPS 统计、计费统计 按量计费 API、监控大盘统计流量,需要精准统计一段时间内真实访问总量。
  3. 分布式限流(Redis+Lua) 分布式环境下基于时间分片实现滑动窗口,精准控制全集群总访问量。
  4. 高频短周期限制 如 10 秒、1 分钟内请求上限,对限流精度要求高的业务。

不适合

需要平滑流量输出、单纯控制处理速率的场景(不如漏桶);单纯应对突发流量场景(不如令牌桶简单高效)。

令牌桶场景通俗分析

令牌桶关键两点:

  1. 令牌匀速产生(控制平均 QPS,保证长期不会压垮服务)
  2. 没人请求时令牌会攒起来,瞬间来了大量请求可以一次性消费攒下的令牌 → 支持突发流量

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 消费限速 秒杀、活动突发流量
令牌桶 支持突发、实现简单、平衡吞吐 微服务网关、普通业务接口、单机限流 下游严格禁止瞬时并发
滑动窗口 统计精准、无临界流量漏洞 验证码 / 登录防刷、分布式限流、计费统计 单纯流量整形、匀速输出场景

总结

漏桶与令牌桶兼顾平稳性,且令牌桶还有突发处理性;而滑动窗口只适合精准防刷。

  1. 匀速保护下游 → 漏桶
  2. 普通业务、允许短时突发 → 令牌桶**(首选)**
  3. 频次风控、精准计数防刷 → 滑动窗口
相关推荐
.道阻且长.6 小时前
2.LeetCode算法习题讲解--双指针--复写零
算法·leetcode·职场和发展
To_OC8 小时前
LC 438 找到所有字母异位词:暴力超时后,我靠滑动窗口一招搞定
javascript·算法·leetcode
Forever Nore11 小时前
学完C语言力扣第一题做不来正常吗
数据结构·算法
hansang_IR11 小时前
【题解】LC:倍增 / 区间并查集(Range Parallel Unionfind)
c++·算法·并查集
Tisfy13 小时前
LeetCode 3731.找出缺失的元素:哈希 / 排序
算法·leetcode·哈希算法·排序·哈希表
lucas_AI13 小时前
Q-CueGraph:你的多模态大模型会 zoom,但真的知道该看哪儿吗?
人工智能·算法
kaixin_啊啊14 小时前
test_机器学习算法学习
学习·算法·机器学习
liulilittle14 小时前
MOE路由:路由(logits: top-k/8)
c++·人工智能·算法·机器学习·llm
旖旎夜光14 小时前
LeetCode 11:盛最多水的容器(双指针问题) —— 题解
数据结构·c++·算法·leetcode·双指针