标准答案

  1. 固定窗口在每个整段时间内计数,开销低,但窗口边界前后可能在很短时间内通过接近两倍配额的请求。
  2. 滑动窗口按时间片或日志统计最近一段时间,限制更平滑,但状态和计算成本更高,需要控制时间片数量与过期清理。
  3. 漏桶按固定速率出水,适合需要平滑下游处理速度的场景;队列满时应拒绝或丢弃,不能无限等待。
  4. 令牌桶按固定速率补充令牌,桶内积累的令牌允许短时突发,适合平均速率受限但允许正常高峰的 API。

题目解析

先问资源能否承受突发。如果数据库或第三方接口完全不能承受,漏桶或有界队列更合适;若只需要控制长期平均且不想误伤正常突发,令牌桶更自然。

算法之外还要设计维度和反馈:按用户还是租户、拒绝还是排队、429 是否给 Retry-After、计数存储故障时如何处理。

常见误区

  • 把滑动窗口和令牌桶说成同一种算法,只因为都能限速。
  • 允许请求无限排队,最后把限流问题转成内存和超时问题。

作者信息