核心结论
滑动窗口限流算法是对固定窗口计数器算法的优化,核心是将整体时间窗口拆分为多个等长的子窗口(时间片),通过"滑动"方式实时更新当前统计窗口的范围,并累加窗口内所有子窗口的请求数,以此精准控制流量,解决固定窗口的临界峰值漏洞。

滑动窗口限流算法的具体原理
1. 时间窗口拆分
首先预设一个整体限流时间窗口 (比如1分钟),并将其拆分为N个等长的子窗口(时间片)。子窗口的粒度决定了限流精度:
- 示例:把1分钟(60秒)的整体窗口拆分为6个10秒的子窗口,或60个1秒的子窗口;子窗口越细,限流精度越高。
2. 窗口滑动规则
每经过一个子窗口的时长(比如10秒),整体时间窗口会向前"滑动"一个子窗口的位置:
- 丢弃最左侧(最旧)的子窗口;
- 纳入最新产生的右侧子窗口;
- 始终保持当前统计窗口的总时长等于预设的整体窗口时长(如1分钟)。
3. 请求计数与限流判断
每个子窗口独立统计自身时间段内的请求数量,当前窗口的总请求数 = 所有包含在当前统计窗口内的子窗口请求数之和:
- 若总请求数 ≤ 预设阈值:允许请求通过,并将请求计入对应子窗口的计数中;
- 若总请求数 > 预设阈值:拒绝请求,避免流量过载。
直观示例
假设整体窗口为1分钟(6个10秒子窗口),限流阈值为1000次/分钟:
- 当时间为00:00:15时,当前统计窗口覆盖的是00:00:05 ~ 00:01:05的6个子窗口(包含00:00:05-00:00:15、00:00:15-00:00:25......00:00:55-00:01:05);
- 累加这6个子窗口的请求数,若总和达到1000,则后续请求会被拒绝,直到窗口滑动后总计数下降。
关键特性
通过"拆分+滑动"的机制,滑动窗口能避免固定窗口在"窗口边界"出现的流量突刺问题(比如固定窗口下,前一个窗口末尾和后一个窗口开头的请求叠加超限),实现更平滑、精准的流量控制。