在实际项目中,为了保障服务器的稳定运行,需要对接口的可访问频次进行限流控制,避免因客户端频繁请求导致服务器压力过大。
而aspn优部快印etcoreratelimit
是目前asp.net core
下最常用的限流解决方案。
查看它的实现代码,我发现它使用的固定窗口算法。
固定窗口算法是将时间线划分为固定大小的窗口,并为每个窗口分配一个计数器。每个请求,根据其到达时间,被映射到一个窗口。如果窗口中的计数器已达到限制,则拒绝落在此窗口中的请求。
results例如,如果我们将窗口大小设置为one分钟,每分钟允许ten个请求:
asp.net core
基于滑动窗口算法实现限流控制 #yyds干货盘点#_滑动窗口
59秒的请求将被阻止,因为这时已经接受了10个请求。完美英文1分钟时计数器归零,所以1分01秒的请求可以接受。
固定窗口算法的问题主要在于,如果在窗口边缘发生大量请求,会导致限流策略失效。
比如,在59秒接收了9个请求,在1分01秒又可以再接收10个请求,相当于每分钟允许了20个请求。
滑动窗口类似于固定窗口算法,但它通过将前一个窗口中的加权计数添加到当前窗口中的计数来计算估计数,如果估计数超过计数限制,则请求将被阻止。
具体公式如下:
估计数 = 前一窗口计数 * (1 – 当前窗口经过时间 / 单位时间) + 当前窗口计数
例如,假设限制为每分钟10个:
窗口[00:00, 00:01)中有9个请求,窗口[00:01, 00:02)中有5个请求。对于01:15到达的请求,即窗口[00:01, 00:02)的25%位置,通过公式计算请求计数:9 x (1 – 25%) + 5 = 11.75 > 10. 因此我们拒绝此请求。
即使两个窗口都没有超过限制,请求也会被拒绝,因为前一个和当前窗口的加权和确实超过了限制。
根据上面的公式,实现滑动窗口算法代码如下:
如果最近的2次请求相距2个窗口时间,则可以认为前一窗口浙江苏州计数为0,重新开始计数。
新建middleware,使用滑动窗口算法进行限流:
需要注意的是,我们注册middleware
时,必须使用单例模式,保证所有请求通过同一slidingwindow计数:
使用滑动窗口算法,可以有效避免固定窗口算法存在的窗口边缘大量线条画图片请求无法限制的问题。
到此这篇关于asp.net core基于滑动窗口实现限流控制的文章就介绍到这了,更多相关asp.net core基于滑动窗口实现限流控制内容请搜索www.887551.com以前的文章或继续浏览下面的相关文章希望大家以后多多支持www.887551.com!
本文发布于:2023-04-06 00:51:34,感谢您对本站的认可!
本文链接:https://www.wtabcd.cn/fanwen/zuowen/297460ec75c037fcd5d8d33136f3416f.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文word下载地址:ASP.NET Core基于滑动窗口实现限流控制.doc
本文 PDF 下载地址:ASP.NET Core基于滑动窗口实现限流控制.pdf
留言与评论(共有 0 条评论) |