文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

ASP.NET Core使用固定窗口限流的方法是什么

2023-06-22 00:23

关注

这篇文章主要讲解了“ASP.NET Core使用固定窗口限流的方法是什么”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“ASP.NET Core使用固定窗口限流的方法是什么”吧!

算法原理

固定窗口算法又称计数器算法,是一种简单的限流算法。在单位时间内设定一个阈值和一个计数值,每收到一个请求则计数值加一,如果计数值超过阈值则触发限流,如果达不到则请求正常处理,进入下一个单位时间后,计数值清零,重新累计。

ASP.NET Core使用固定窗口限流的方法是什么

如上图所示,时间单位是1秒,阈值是3。

算法实现

这里讲两种实现方法:进程内即内存固定窗口算法、基于Redis的固定窗口算法。

进程内即内存固定窗口算法

使用字典,Key是限流目标,Value包括计数值和过期时间。处理请求时,首先从请求中提取限流目标,然后根据限流目标去字典中查找,如果不存在,则添加一个字典项,计数值是1,过期时间是当前时间+限流单位时间;如果存在,则检查是否过期,如果过期,则计数值归1,过期时间是当前时间+限流单位时间,如果未过期,则仅计数值加1。这里需要注意多线程问题,读写数据时需要加锁。

在C#语言中可以使用MemoryCache,它的缓存项有一个过期时间,不需要自己回收过期的项目。

进程内计数的方法最适合单实例处理的程序限流,多实例处理的情况下可能每个实例收到的请求数不均匀,不能保证限流效果。

基于Redis的固定窗口算法

Redis作为KV存储,类似于字典,而且也自带过期时间。处理请求时,首先从请求中提取限流目标,然后根据限流目标去Redis中查找,如果不存在,则添加KV项,Value值是1,过期时间是当前时间+限流单位时间;如果存在,则Value值加1。

这些操作逻辑可以封装在一个Lua script中,因为Lua script在Redis中执行时也是原子操作,所以Redis的限流计数在分布式处理时天然就是准确的。

算法应用

这里以限流组件 FireflySoft.RateLimit 为例,实现ASP.NET Core中的固定窗口限流。

1、安装Nuget包

有多种安装方式,选择自己喜欢的就行了。

包管理器命令:

Install-Package FireflySoft.RateLimit.AspNetCore

或者.NET命令:

dotnet add package FireflySoft.RateLimit.AspNetCore

或者项目文件直接添加:

<ItemGroup>

<PackageReference Include="FireflySoft.RateLimit.AspNetCore" Version="2.*" />

</ItemGroup>

2、使用中间件

在Startup中使用中间件,演示代码如下(下边会有详细说明):

public void ConfigureServices(IServiceCollection services)        {           ...           app.AddRateLimit(new InProcessFixedWindowAlgorithm(                new[] {                    new FixedWindowRule()                    {                        ExtractTarget = context =>                        {                        // 提取限流目标                            return (context as HttpContext).Request.Path.Value;                        },                        CheckRuleMatching = context =>                        {                        // 判断当前请求是否需要限流处理                            return true;                        },                        Name="fixed window limit rule",                        LimitNumber=30, // 限流阈值                        StatWindow=TimeSpan.FromSeconds(1) // 限流单位时间                    }                })            );            ...        }public void Configure(IApplicationBuilder app, IWebHostEnvironment env)        {            ...            app.UseRateLimit();            ...        }

如上需要先注册服务,然后使用中间件。

注册服务的时候需要提供限流算法和对应的规则:

基本的使用就是上边例子中的这些了。

如果还是基于传统的.NET Framework,则需要在Application_Start中注册一个消息处理器RateLimitHandler,算法和规则部分都是共用的,具体可以看Github上的使用说明:https://github.com/bosima/FireflySoft.RateLimit#aspnet

FireflySoft.RateLimit 是一个基于 .NET Standard 的限流类库,其内核简单轻巧,能够灵活应对各种需求的限流场景。

其主要特点包括:

感谢各位的阅读,以上就是“ASP.NET Core使用固定窗口限流的方法是什么”的内容了,经过本文的学习后,相信大家对ASP.NET Core使用固定窗口限流的方法是什么这一问题有了更深刻的体会,具体使用情况还需要大家实践验证。这里是编程网,小编将为大家推送更多相关知识点的文章,欢迎关注!

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯