限流四大算法:从计数器到令牌桶
2026/8/24大约 3 分钟
亿级规模系统系列 · 阶段 5 · 流量防护 · 第 29/49 篇 · 🚧 占位待学
上一篇:《雪崩机理:一次超时如何拖死全链路》
下一篇:《集群限流:总水位怎么算》
学习大纲:《QPS 过万与亿级消息系统设计学习总纲》
状态:待学习。 本文为占位文档:知识点清单、实验与验收标准已就绪,正文待按「先学习、先实验、再撰写」补全。
对应总纲单元:阶段 5 · 单元 5.2
一、本文要解决的问题
「接口每秒最多 1000 次」怎么实现才既准又稳?固定窗口在窗口边界会放进双倍流量,滑动窗口精确但费内存,漏桶匀速但牺牲突发,令牌桶允许突发但可能压垮下游。四大算法没有最好,只有最合适。
二、知识点清单
- 固定窗口计数器:实现最简单,临界突刺问题(两窗口边界放进 2 倍流量)
- 滑动窗口:把 1s 切成 N 个格子滚动统计,精度与内存的取舍
- 漏桶:恒定速率流出(绝对匀速),适合对脆弱下游的保护;突发流量排队或拒绝
- 令牌桶:恒定速率放令牌、桶可攒令牌(允许突发),适合平滑大多数场景;Guava RateLimiter 的实现(预支 / 预热模式)
- 单机限流的工程实现:AtomicLong / Redis incr / Guava,及分布式环境下各实例独立限流的总量误差
三、动手实验(学习时必须真跑)
- 手写固定窗口与滑动窗口限流器(Java),用压测在窗口边界打流量,实测对比突刺差异
- Guava RateLimiter(含 SmoothBursty 与 SmoothWarmingUp)给接口限流,压测观察被拒曲线与突发行为
- 漏桶与令牌桶各实现一个(或用现成库),用突发流量对比两者的放行曲线
四、验收标准(全部通过才进入下一篇)
五、写作提示(补正文时遵守)
- 开篇问题驱动;结构走「是什么 → 为什么 → 怎么做 → 背景知识」
- 所有代码、命令、输出必须先在本机跑通再写入,不得杜撰
- 版本口径以总纲环境清单为准(Spring Boot 3.x / MySQL 8.0 / Redis 8.x / RocketMQ 5.3.x / Kafka 4.3 / ShardingSphere 5.5.3)
- 涉及版本敏感结论时标注出处与时间
本篇完成后,把文首导航块的「🚧 占位待学」去掉,并在总纲处打卡。