常用的限流方式-滑动窗口(计数器的改进版)

开发 前端
当用户在 0:59 秒钟发送了 200 个请求就会被第六个格子的计数器记录 +200,当下一秒的时候时间窗口向右移动了一个,此时计数器已经记录了该用户发送的 200 个请求,所以再发送的话就会触发限流,则拒绝新的请求。

滑动窗口是针对计数器存在的临界点缺陷,所谓滑动窗口(Sliding window)是一种流量控制技术,这个词出现在 TCP 协议中。滑动窗口把固定时间片进行划分,并且随着时间的流逝,进行移动,固定数量的可以移动的格子,进行计数并判断阀值。

上图中我们用红色的虚线代表一个时间窗口(一分钟),每个时间窗口有 6 个格子,每个格子是 10 秒钟。每过 10 秒钟时间窗口向右移动一格,可以看红色箭头的方向。我们为每个格子都设置一个独立的计数器 Counter,假如一个请求在 0:45 访问了那么我们将第五个格子的计数器 +1(也是就是 0:40~0:50),在判断限流的时候需要把所有格子的计数加起来和设定的频次进行比较即可。

那么滑动窗口如何解决我们上面遇到的问题呢?来看下面的图:

当用户在 0:59 秒钟发送了 200 个请求就会被第六个格子的计数器记录 +200,当下一秒的时候时间窗口向右移动了一个,此时计数器已经记录了该用户发送的 200 个请求,所以再发送的话就会触发限流,则拒绝新的请求。

其实计数器就是滑动窗口啊,只不过只有一个格子而已,所以想让限流做的更精确只需要划分更多的格子就可以了,为了更精确我们也不知道到底该设置多少个格子,格子的数量影响着滑动窗口算法的精度,依然有时间片的概念,无法根本解决临界点问题。

责任编辑:武晓燕 来源: 今日头条
相关推荐

2023-08-08 08:01:22

微服务架构服务

2009-12-22 13:25:58

WCF性能计数器内存

2022-09-06 08:31:09

线程池工具系统

2009-11-25 15:07:39

PHP添加计数器

2009-06-11 16:27:18

科学型Java计数器

2012-07-31 13:31:34

Windows 8鼠标键盘

2012-07-31 09:47:22

微软Windows 8

2009-12-01 15:01:07

PHP生成访问计数器

2009-11-06 16:59:26

WCF性能计数器

2023-07-28 08:15:27

PC程序计数器

2009-10-29 11:47:15

ADO.NET计数器b

2009-11-30 18:08:30

PHP制作动态计数器

2010-02-22 16:34:17

WCF性能计数器

2010-07-16 14:37:53

SQL Server

2022-08-29 19:51:58

CSS计数器

2024-03-04 08:53:50

海量数据计数器存储

2009-04-15 10:33:35

SQL Server 性能计数器错误

2010-06-12 17:16:46

MySQL数据库

2024-02-07 12:32:00

重构技巧PythonCounter

2023-11-09 08:14:07

时间窗口限流
点赞
收藏

51CTO技术栈公众号