标准答案

  1. 固定窗口按时间段计数,适合实现简单的粗粒度配额,但窗口边界可能允许短时间双倍流量。
  2. 滑动窗口按最近一段时间计算,更准确地限制连续流量,但需要保存更多时间片或事件。
  3. 令牌桶按速率产生令牌并允许积累,适合允许一定突发但控制长期平均速率的 API。
  4. 漏桶按固定速率处理或排出,适合平滑下游压力,但突发可能排队或被拒绝。

题目解析

固定窗口实现简单,但窗口边界可能让两个相邻窗口的请求集中在极短时间内通过;滑动窗口更接近真实时间范围,代价是计数存储和计算更高。

令牌桶适合允许可控突发的 API:令牌按平均速率补充,桶容量决定最多能吸收多大的瞬时流量。漏桶更强调稳定流出,突发会转化为排队或拒绝。

分布式限流还要说明计数器的一致性、时钟、网络延迟、故障时的默认行为和超限反馈。算法名称本身不能证明策略在多实例环境下有效。

常见误区

  • 误区:认为四种算法只有名字不同。改正:说明是否允许突发、窗口精度、存储成本和满载后的行为,再按业务选型。
  • 误区:只看长期平均速率。改正:检查窗口边界、桶容量、短时峰值和 P99,确认突发不会压垮下游。
  • 误区:分布式计数不考虑时钟和网络延迟。改正:明确计数存储、原子更新、故障降级和多实例下的误差范围。

作者信息