滑动时间窗口和固定时间窗口的区别

滑动时间窗口和固定时间窗口是两种常见的限流算法,它们的主要区别在于如何处理时间窗口和请求的计数方式。

一、固定时间窗口算法

1.定义

固定时间窗口算法将时间划分为多个固定长度的窗口,每个窗口内允许通过的请求数量是固定的。例如,每秒允许100个请求通过。

2.工作原理

  • 时间窗口划分:时间被划分为固定长度的窗口,例如每秒一个窗口。

  • 请求计数:在每个窗口内,对进入的请求进行计数。

  • 限流规则:如果当前窗口内的请求数量达到限流值(如100个),后续请求将被拒绝,直到下一个时间窗口开始。

3.优点

  • 简单易实现:逻辑简单,容易理解和实现。

  • 性能高效:计数操作简单,性能开销小。

4.缺点

  • 突发流量问题:在窗口的边界处,可能会出现短时间内大量请求被拒绝的情况。例如,如果一个窗口的最后100个请求刚好达到限流值,而下一个窗口的前100个请求也刚好到达,这会导致在窗口切换的瞬间出现突发流量,大量请求被拒绝。

  • 不够平滑:请求的通过和拒绝是基于固定时间窗口的,不够平滑。

5.示例

假设限流规则是每秒100个请求:

在第1秒内,前100个请求通过,第101个请求被拒绝。

在第2秒内,前100个请求通过,第101个请求被拒绝。

二、滑动时间窗口算法

1.定义

滑动时间窗口算法通过滑动窗口来平滑处理请求,避免固定时间窗口的突发流量问题。滑动窗口会根据时间滑动,而不是固定在某个时间点。

2.工作原理

  • 时间窗口划分:时间被划分为多个小的时间段,每个时间段称为一个“桶”。

  • 请求计数:每个桶内对进入的请求进行计数。

  • 滑动窗口:滑动窗口包含多个桶,窗口的大小固定,但会随着时间滑动。

  • 限流规则:如果滑动窗口内的请求数量达到限流值(如100个),后续请求将被拒绝。

3.优点

  • 平滑处理请求:避免了固定时间窗口的突发流量问题,请求的通过和拒绝更加平滑。

  • 更灵活:可以更灵活地处理突发流量,减少因窗口切换导致的大量请求被拒绝的情况。

4.缺点

  • 实现复杂:逻辑相对复杂,需要管理多个桶和滑动窗口。

  • 性能开销:需要维护多个桶的状态,性能开销相对较大。

5.示例

假设滑动时间窗口为1秒,限流为每秒100个请求,窗口划分为10个桶,每个桶为100毫秒:
在第1秒内,前100个请求通过,第101个请求被拒绝。
滑动窗口会随着时间滑动,例如在第1秒的第110毫秒,窗口会滑动到包含第110毫秒到第210毫秒的桶。
如果在第1秒的第110毫秒,滑动窗口内的请求数量达到100个,后续请求将被拒绝。

三、对比

特点 固定时间窗口 滑动时间窗口
时间窗口划分 固定长度的时间窗口 多个小的时间段(桶),滑动窗口
请求计数 每个窗口内计数 每个桶内计数,滑动窗口汇总
限流规则 每个窗口内达到限流值后拒绝后续请求 滑动窗口内达到限流值后拒绝后续请求
优点 简单易实现,性能高效 平滑处理请求,避免突发流量问题
缺点 突发流量问题,不够平滑 实现复杂,性能开销较大
适用场景 对性能要求高,对突发流量容忍度低 对平滑处理请求要求高,对性能要求稍低

四、选择建议

固定时间窗口:适用于对性能要求高,且对突发流量容忍度低的场景。例如,简单的接口限流,对突发流量的要求不高。

滑动时间窗口:适用于对平滑处理请求要求高,需要避免突发流量问题的场景。例如,高并发的秒杀系统,需要平滑处理请求,减少因窗口切换导致的大量请求被拒绝。

来源链接:https://www.cnblogs.com/Junjunyi/p/19034880

请登录后发表评论

    没有回复内容