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

一、漏桶算法 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. 频次风控、精准计数防刷 → 滑动窗口
相关推荐
可编程芯片开发10 小时前
基于MATLAB的PEF湍流风场生成器模拟与仿真
算法
罗西的思考11 小时前
【Agentic RL / 强化学习 / OPD】OpenClaw-RL 源码阅读笔记 --- (9)--- Reward Judging
人工智能·算法·机器学习
Mr.HeBoYan12 小时前
一次持续三天才出现的丢包故障——深入解析 DPDK Memory Ordering、rte_ring 与 CPU Memory Barrier (下)
linux·网络·算法·架构·dpdk
wabs66613 小时前
关于图论【深度优先搜索的理论基础】
算法·深度优先·图论
先吃饱再说13 小时前
LeetCode 101. 对称二叉树
算法
是Dream呀14 小时前
人眼看不出的伪造,AI如何识别?实测合合信息跨模态鉴伪与去反光技术
算法
QN1幻化引擎14 小时前
SFA 信号场注意力:用8KB参数换248x KV Cache压缩,边缘设备也能跑长序列
人工智能·算法·gitee·gitlab
段一凡-华北理工大学14 小时前
向量数据库实战:选型、调优与落地~系列文章03:向量相似度算法全解:余弦、欧氏、内积,到底该用哪个?
大数据·数据库·人工智能·算法·机器学习·向量相似度·高炉炼铁
cjr_xyi16 小时前
AT1202Contest_c binarydigit 题解
c语言·c++·算法
atunet16 小时前
从算法优化到系统加速的多层级思考7
算法