标准答案

  1. 以时间戳队列保存最近请求,删除窗口外记录后判断剩余数量。
  2. 高流量场景可用多个时间桶近似,桶越细越准确但存储和更新成本越高。
  3. 分布式实现要考虑计数原子性、时钟偏差和过期清理。

题目解析

固定窗口只保存当前桶计数,在窗口边界附近可能让请求短时间通过两倍额度。精确滑动窗口保存最近事件,能减少边界误差,但高流量下会带来更多内存和清理成本。

时间桶是常见近似:桶越细,精度越高,更新和存储开销也越大。实现要处理过期清理、取消是否计数以及请求开始还是成功时计数。

多实例滑动窗口需要共享的原子时间桶或近似算法,并处理时钟偏差和存储故障。限流误差要与业务风险匹配,不能只追求数学精确。

代码示例

单机时间戳队列示意:

TypeScript
while (timestamps.length && timestamps[0] <= now - windowMs) timestamps.shift()
if (timestamps.length >= limit) return false
timestamps.push(now)
return true

常见误区

  • 误区:时间戳不清理。改正:每次判断和后台任务都清理窗口外记录,并设置内存上限。
  • 误区:只在请求开始计数却不说明取消行为。改正:先定义限制请求进入、并发占用还是成功完成,并保持指标语义一致。
  • 误区:多节点使用本地窗口却当成全局窗口。改正:使用共享计数或明确接受每节点近似误差。

作者信息