iis服务器助手广告广告
返回顶部
首页 > 资讯 > 精选 >ASP.NET Core基于滑动窗口实现限流控制的方法
  • 520
分享到

ASP.NET Core基于滑动窗口实现限流控制的方法

2023-06-29 08:06:19 520人浏览 薄情痞子
摘要

今天小编给大家分享一下asp.net Core基于滑动窗口实现限流控制的方法的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解

今天小编给大家分享一下asp.net Core基于滑动窗口实现限流控制的方法的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。

前言:

在实际项目中,为了保障服务器的稳定运行,需要对接口的可访问频次进行限流控制,避免因客户端频繁请求导致服务器压力过大。

AspnetcoreRateLimit是目前ASP.net core下最常用的限流解决方案。

查看它的实现代码,我发现它使用的固定窗口算法

var entry = await _counterStore.GetAsync(counterId, cancellationToken);if (entry.HasValue){    // entry has not expired    if (entry.Value.Timestamp + rule.PeriodTimespan.Value >= DateTime.UtcNow)    {        // increment request count        var totalCount = entry.Value.Count + _config.RateIncrementer?.Invoke() ?? 1;        // deep copy        counter = new RateLimitCounter        {            Timestamp = entry.Value.Timestamp,            Count = totalCount        };    }}

二、固定窗口算法

固定窗口算法是将时间线划分为固定大小的窗口,并为每个窗口分配一个计数器。每个请求,根据其到达时间,被映射到一个窗口。如果窗口中的计数器已达到限制,则拒绝落在此窗口中的请求。

例如,如果我们将窗口大小设置为one分钟,每分钟允许ten个请求:

ASP.NET Core基于滑动窗口实现限流控制的方法

ASP.net core基于滑动窗口算法实现限流控制 #yyds干货盘点#_滑动窗口

59秒的请求将被阻止,因为这时已经接受了10个请求。1分钟时计数器归零,所以1分01秒的请求可以接受。

固定窗口算法的问题主要在于,如果在窗口边缘发生大量请求,会导致限流策略失效。

比如,在59秒接收了9个请求,在1分01秒又可以再接收10个请求,相当于每分钟允许了20个请求。

三、滑动窗口算法

滑动窗口类似于固定窗口算法,但它通过将前一个窗口中的加权计数添加到当前窗口中的计数来计算估计数,如果估计数超过计数限制,则请求将被阻止。

具体公式如下:

估计数 = 前一窗口计数 * (1 - 当前窗口经过时间 / 单位时间) + 当前窗口计数

例如,假设限制为每分钟10个:

ASP.NET Core基于滑动窗口实现限流控制的方法

窗口[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. 因此我们拒绝此请求。

即使两个窗口都没有超过限制,请求也会被拒绝,因为前一个和当前窗口的加权和确实超过了限制。

四、实现

根据上面的公式,实现滑动窗口算法代码如下:

public class SlidingWindow{    private readonly object _syncObject = new object();    private readonly int _requestIntervalSeconds;    private readonly int _requestLimit;    private DateTime _windowstartTime;    private int _prevRequestCount;    private int _requestCount;    public SlidingWindow(int requestLimit, int requestIntervalSeconds)    {        _windowStartTime = DateTime.Now;        _requestLimit = requestLimit;        _requestIntervalSeconds = requestIntervalSeconds;    }    public bool PassRequest()    {        lock (_syncObject)        {            var currentTime = DateTime.Now;            var elapsedSeconds = (currentTime - _windowStartTime).TotalSeconds;            if (elapsedSeconds >= _requestIntervalSeconds * 2)            {                _windowStartTime = currentTime;                _prevRequestCount = 0;                _requestCount = 0;                elapsedSeconds = 0;            }            else if (elapsedSeconds >= _requestIntervalSeconds)            {                _windowStartTime = _windowStartTime.AddSeconds(_requestIntervalSeconds);                _prevRequestCount = _requestCount;                _requestCount = 0;                elapsedSeconds = (currentTime - _windowStartTime).TotalSeconds;            }             var requestCount = _prevRequestCount * (1 - elapsedSeconds / _requestIntervalSeconds) + _requestCount + 1;            if (requestCount <= _requestLimit)            {                _requestCount++;                return true;            }        }        return false;    }}

如果最近的2次请求相距2个窗口时间,则可以认为前一窗口计数为0,重新开始计数。

六、使用

新建Middleware,使用滑动窗口算法进行限流:

public class RateLimitMiddleware : IMiddleware{    private readonly SlidingWindow _window;    public RateLimitMiddleware()    {        _window = new SlidingWindow(10, 60);    }    public async Task InvokeAsync(HttpContext context, RequestDelegate next)    {        if (!_window.PassRequest())        {            context.SetEndpoint(new Endpoint((context) =>            {                context.Response.StatusCode = StatusCodes.Status403Forbidden;                return Task.CompletedTask;            },                        EndpointMetadataCollection.Empty,                        "限流"));        }        await next(context);    }}

需要注意的是,我们注册Middleware时,必须使用单例模式,保证所有请求通过同一SlidingWindow计数:

services.AddSingleton<RateLimitMiddleware>();

以上就是“ASP.net Core基于滑动窗口实现限流控制的方法”这篇文章的所有内容,感谢各位的阅读!相信大家阅读完这篇文章都有很大的收获,小编每天都会为大家更新不同的知识,如果还想学习更多的知识,请关注编程网精选频道。

--结束END--

本文标题: ASP.NET Core基于滑动窗口实现限流控制的方法

本文链接: https://www.lsjlt.com/news/323831.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • ASP.NET Core基于滑动窗口实现限流控制的方法
    今天小编给大家分享一下ASP.NET Core基于滑动窗口实现限流控制的方法的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解...
    99+
    2023-06-29
  • ASP.NET Core基于滑动窗口实现限流控制
    目录前言:二、固定窗口算法三、滑动窗口算法四、实现六、使用结论:前言: 在实际项目中,为了保障服务器的稳定运行,需要对接口的可访问频次进行限流控制,避免因客户端频繁请求导致服务器压力...
    99+
    2024-04-02
  • Asp.NET Core 限流控制(AspNetCoreRateLimit)的实现
    起因: 近期项目中,提供了一些调用频率较高的api接口,需要保障服务器的稳定运行;需要对提供的接口进行限流控制。避免因客户端频繁的请求导致服务器的压力。 一、AspNetCoreRa...
    99+
    2024-04-02
  • ASP.NET Core中使用滑动窗口限流的问题举例分析
    本篇内容主要讲解“ASP.NET Core中使用滑动窗口限流的问题举例分析”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“ASP.NET Core中使用滑动窗口限流的问题举例分...
    99+
    2023-06-22
  • ASP.NET Core中使用滑动窗口限流的问题及场景分析
    目录算法原理漏检太刚算法实现进程内即内存滑动窗口算法基于Redis的滑动窗口算法应用算法1、安装Nuget包2、使用中间件滑动窗口算法用于应对请求在时间周期中分布不均匀的情况,能够更...
    99+
    2024-04-02
  • ASP.NET Core使用固定窗口限流的方法是什么
    这篇文章主要讲解了“ASP.NET Core使用固定窗口限流的方法是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“ASP.NET Core使用固定窗口限流的方法是什么...
    99+
    2023-06-22
  • redis zset实现滑动窗口限流的代码
    目录限流redis zset特性滑动窗口算法java代码实现补充:Redis zSet实现滑动窗口对短信进行防刷限流前言示例代码限流 需求背景:同一用户1分钟内登录失败次数超过3次,...
    99+
    2024-04-02
  • 基于Redis zSet实现滑动窗口对短信进行防刷限流的问题
    前言   主要针对目前线上短信被脚本恶意盗刷的情况,用Redis实现滑动窗口限流 public void checkCurrentWindowValue(String telNum)...
    99+
    2024-04-02
  • 基于 Redis 实现接口限流的方式
    目录基于 Redis 实现接口限流1. 准备工作2. 限流注解3. 定制 RedisTemplate4. 开发 Lua 脚本5. 注解解析6. 接口测试7. 全局异常处理总结基于 R...
    99+
    2024-04-02
  • JavaScript实现鼠标控制自由移动的窗口
    本文实例为大家分享了JavaScript实现鼠标控制自由窗口的具体代码,供大家参考,具体内容如下 代码: <!DOCTYPE html> <html lang...
    99+
    2024-04-02
  • Spring Security实现基于RBAC的权限表达式动态访问控制的操作方法
    目录资源权限表达式Spring Security中的实现MethodSecurityExpressionHandler思路以及实现配置和使用昨天有个粉丝加了我,问我如何实现类似shi...
    99+
    2024-04-02
  • 基于Redis实现分布式应用限流的方法
    限流的目的是通过对并发访问/请求进行限速或者一个时间窗口内的的请求进行限速来保护系统,一旦达到限制速率则可以拒绝服务。前几天在DD的公众号,看了一篇关于使用 瓜娃 实现单应用限流的方案 --》原文,参考《redis in action》 实...
    99+
    2023-05-30
    redis 限流 流的
  • 基于 .NET 6 的ASP.NET Core启动地址配置方法及优先级顺序
    目录前言:一、设置方法​1. applicationUrl 属性​​2.环境变量​​3.命令行参数​​4. UseUrls 方法​.NET 5 版本.NET 6 版本​5. UseK...
    99+
    2024-04-02
  • VC中控制台程序创建窗口的实例方法
    在VC控制台程序中调用D3DVideoRender时,需要创建新的窗口控件显示图像 #include "windows.h" #include "TCHAR.h" //声明自...
    99+
    2024-04-02
  • 基于resty security的Api权限控制与事务支持的方法
    这篇文章主要介绍了基于resty security的Api权限控制与事务支持的方法的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇基于resty security的Api权限控制与事务支持的方...
    99+
    2023-06-29
  • Vuerouter的addRoute方法实现控制权限方法详解
    目录路由分为静态路由和动态路由静态路由和动态路由的优缺点动态路由实现思路动态路由遇到的问题与解决方式路由分为静态路由和动态路由 静态路由和动态路由的优缺点 1、中大型项目,采用的都是...
    99+
    2024-04-02
  • PHP中基于控制器的路由实现方式
    随着Web应用程序的复杂性增加,有效管理URL和路由成为了开发过程中的一个重要任务。在PHP中,可以使用基于控制器的路由实现方式来解决这个问题。本文将介绍基于控制器的路由实现方式,并提供具体的代码示例。基本原理基于控制器的路由实现方式是指将...
    99+
    2023-10-21
    PHP 控制器路由 基于控制器的路由实现 PHP 控制器路由方式
  • ASP.NET Core自动生成小写破折号路由的实现方法
    目录1、如何生成小写的路由可以这样设置2、生成带破折号并且小写的路由可以这样设置3、解决方案3.1对于Asp.NetCore2.2MVC:3.2  对于Asp.N...
    99+
    2024-04-02
  • 实现ASP.NET Core自动生成小写破折号路由的方法
    这篇文章主要讲解了“实现ASP.NET Core自动生成小写破折号路由的方法”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“实现ASP.NET Core自动生成小写破折号路由的方法”吧!默认情...
    99+
    2023-06-14
  • 如何实现基于iview的router常用控制方式
    这篇文章将为大家详细讲解有关如何实现基于iview的router常用控制方式,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。1 iview的router控制需求最近在使用i...
    99+
    2024-04-02
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作