常见限流算法有哪些,各自原理是什么?
未标记
询问 AI
考查重点:时间窗、漏桶与令牌容量。固定窗按周期计数易在边界突发,滑窗统计最近窗口更平滑;令牌桶按速率补令牌允许有限突发,漏桶以固定速率出队,按是否允许突发与排队选择
本题目录
参考答案
本答案基于相关资料,由 AI 辅助编写,供学习与面试准备参考。如有疏漏,欢迎反馈指正。
核心回答
常见限流算法有四类:固定窗口统计每个固定时间段的请求数;滑动窗口持续统计最近一段时间;漏桶按较稳定的速率放行或输出;令牌桶按固定速率补充令牌,请求消耗令牌,因此可在桶容量内允许短时突发。
选择取决于希望约束什么:粗粒度配额可用固定窗口,滚动时间段统计可用滑动窗口,下游要求平滑请求可用漏桶,平均速率受控且允许突发可用令牌桶。请求速率限制还应配合并发数、队列长度和等待超时。
四种机制的边界
固定窗口简单、状态少,但存在交界突刺:每分钟100次,如果上一分钟末尾100次、下一分钟开头100次,两个窗口都合规,极短时间内却通过200次。
滑动日志保留请求时间戳,精确删除窗口外记录,统计较准但空间与请求量相关;分桶计数或前后窗口加权更省资源,但有粒度误差。滑动窗口是限制整个观察区间的总量,不要求每个小格都平均分配固定配额。
漏桶若以排队整形实现,入口可以突发,但出口按设定间隔放行;队列满或等待超过预算就拒绝。它限制的不是任务实际执行耗时,因此仍要关注下游并发。
令牌桶以速率r积累令牌,最多存B个,每个请求按成本取令牌。空闲后可立即放过最多B个单位成本的突发,之后受补充速率约束;B不是另一个持续QPS阈值。
追问
- 多实例各限100是否全局100? 不是,需集中状态、分配配额或容忍近似误差;状态检查和扣减要原子化。
- 按什么维度限? 可按租户、用户、接口、下游或全局组合,先明确公平性和容量边界。
- 被限后怎么处理? 明确拒绝或有限排队,并返回可理解的重试信息;客户端退避,避免立即重试形成更大流量。
参考资料
- 国内:JavaGuide / Snailclimb:常见限流算法:参考四类算法的比较,区分正文中按时间统计、平滑输出与允许突发的限流目标。
- 国内:doocs:如何限流?:窗口交界的反例说明一个固定窗口合规,并不代表任意连续时间段都受同样约束。
- 国内:Alibaba Sentinel:流量控制:QPS与在途并发的区分说明限速不能代替资源并发保护;匀速排队对应平滑输出。
- 国外:Cloudflare:How we built rate limiting capable of scaling to millions of domains:按上一窗口加权估算的示例说明低成本滑动计数为什么仍是近似统计。
- 国外:IETF:RFC3290 Appendix A:依据令牌积累速率与桶容量的定义,解释正文中长期速率受限和短期突发额度的区别。


