.NET 7 新增速率限制 (Rate Limiting) 功能,轻松限制请求数量

前言

.NET 7  内置了速率限制(Rate Limiting)功能,速率限制指的是限制可访问资源的请求数。例如数据库每分钟可以安全处理 1000 个请求,再多不确定会不会崩。

这时就可以在应用程序中放一个速率限制器,规定每分钟只允许 1000 个请求,在达到这个数量后开始拒绝请求。这是一种保护资源的方法,可以避免应用在高浏览的情况下崩溃。

有很多种不同的算法来控制请求流,下面介绍 .NET 7 中提供的 4 种方法:

并发限制

顾名思义,并发限制器就是限制有多少并发请求可以访问资源。如果限制是 10,那么只有 10 个请求可以同时访问一个资源,第 11 个请求将被拒绝。

一旦前面的请求完成,则允许的请求数量会增加 1,当第二个请求完成时,数量增加到 2,依此类推。该算法是通过 释放 RateLimitLease 来完成的。

令牌桶

令牌桶是另一种算法,就像一个装满令牌的桶。每隔一段时间,桶内会新增固定数量的令牌,但令牌数不能超过桶可容纳的最大数量。当一个请求进来时,它会获取并保存一个令牌,如果存储桶为空,则新请求进入时没有令牌可获取,即将被拒绝访问资源。

假设单个桶可以容纳 10 个令牌,且每分钟往里面加入 2 个令牌。现在有 3 个请求进来了,剩下 7 个令牌。一分钟后,桶自动补充到 9 个令牌,然后 9 个请求瞬间取走所有令牌。那么接下来在桶内添加令牌之前,所有请求都不允许访问资源。如果接下来没有请求,则桶会在 5 分钟内自动补到 10 个令牌,然后等待请求。

固定窗口限制

固定窗口算法使用 “窗口” 的概念,窗口采用时间计量,在固定的一段时间内限制最大请求,并在切换到下一个窗口的时候重置请求数。

假设现在有一个最多只能容纳 100 人(最大请求数)的电影院(窗口),每场电影需要播放 2 个小时(窗口持续时间)。电影开始后,剩下的观众(请求)只能排队等待下一场窗口,排队的最大数量也是 100 ,超出的部分不允许继续排队,只能等待下一个窗口开始后才能继续排队。

滑动窗口限制

滑动窗口算法类似于固定窗口算法,但增加了 “段(segments)” 的概念。

1、一个段是一个窗口的一部分,如果将前面 2 小时的窗口分成 4 个段,则会有 4 个 30 分钟的段。此外还有一个 “段索引”,它始终指向窗口中的最新段。

2、30 分钟内的请求进入最新的段,且每 30 分钟窗口滑动一个段。如果在窗口滑过段期间出现了新的请求,则该请求会被刷新,且段的最大限制会增加。如果没有请求,则段的限制保持不变。

例设现在有一个滑动窗口,它包含 3 个 10 分钟的段,最多只能接受 100 个请求。现在它的初始状态是 3 个段,计数均为 0,当前的段索引指向第 3 个段。

4b4336311852a17fccc979d39f0c7634.png

在前 10 分钟内,我们收到 50 个请求,所有请求都在第 3 段(段索引所在的位置)。10 分钟过去后,我们将窗口滑动 1 段,同时将当前段索引移动到第 4 段。

ffb8d17e47a0b2d03bc98f12831e52d9.png

接下来的 10 分钟内,我们又收到了 20 个请求,所以现在第 3 段有 50 个,第 4 段有 20 个。同样在 10 分钟过去后窗口开始滑动,因此当前的段索引指向了 5,而由于段 3 和段 4 都在窗口内,因此窗口只剩 20 个请求名额。

a63750f04d9498a3ba2409f1b47b913f.png

又过了 10 分钟后,再次滑动窗口,这一次窗口滑动后段索引为 6,但段 3(有 50 个请求的段)已位于窗口之外,因此窗口收回了 50 个请求限额。由于段 4 仍有 20 个请求,所以滑动窗口的请求限额变为 80 。

48194ad91e5c7263c2dfd22e88620cce.png

微软博客中有关于速率限制功能和相关 API 、中间件的详细介绍,对此功能感兴趣的朋友可在Nuget中进一步了解。

转自:OSCHINA

链接:oschina.net/news/202961/rate-limiting-for-dotnet

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/284694.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Linux Tomcat8 启动堆内存溢出

今天在部署一个开源项目的时候,Tomcat8启动异常,报错信息: Exception in thread "RMI TCP Connection(idle)" java.lang.OutOfMemoryError: PermGen space 根据报错信息我们可以看出是堆内存不够。所以需要手动设置堆内存大小&…

【BIM入门实战】Revit视图中图元看不见的原因总结

在Revit模型设计的过程中,有时会提示绘制的图元不可见,通常情况下,可以采用以下三种方法让隐藏的图元显示出来。 原因一:视图范围 平面视图的形成是由操作平面对三维进行 水平切割的俯视图,如果绘制的图元不可见&…

用C#为国产智能手表写“Hello, China. ”

在此之前, 我写过几篇如何使用C#编写STM32程序的例子, 那么同样, ESP32下我们也可以使用C#,我们依然仰仗于一直在发展壮大的 .Net nanoFramework , 目前他支持的开发板越来越多 , 支持的芯片种类也越来越多&#xff0c…

数据迁移 (选做)

1. pip install flask-migrate #Flask-Migrate 是一个数据迁移框架,需要通过Flask-script库来操作. 2. pip install flask-script #通过命令行来操作Flask 3. 新建模型更改文件:manage.py from flask_script import Managerfrom flask_migrate import Migrate, Mi…

驱动之LCD的介绍与应用20170209

本文主要介绍的是LCD的介绍与应用,直接看个人笔记即可: 转载于:https://www.cnblogs.com/yuweifeng/p/6382551.html

ArcGIS实验教程——实验四十四:ArcGIS地图浮雕效果制作完整案例教程

ArcGIS制作地图时可以制作出很多很炫的效果,比如地图阴影、地图晕渲效果、浮雕效果、三维效果等等。本实验讲解在ArcGIS中制作浮雕效果地图,效果如下所示: 扩展阅读:【ArcGIS Pro微课1000例】0016:ArcGIS Pro 2.8浮雕效果地图制图案例教程 1. 加载矢量数据 加载实验数据包…

Mysql,SqlServer,Oracle主键自动增长的设置

参考文献 http://blog.csdn.net/andyelvis/article/details/2446865 1、把主键定义为自动增长标识符类型 MySql 在mysql中,如果把表的主键设为auto_increment类型,数据库就会自动为主键赋值。例如: create table customers(id int auto_incre…

【ArcGIS Pro微课1000例】0016:ArcGIS Pro 2.8浮雕效果地图制图案例教程

ArcGIS Pro制作地图时可以制作出很多很炫的效果,比如地图阴影、地图晕渲效果、浮雕效果、三维效果等等。本实验讲解在ArcGIS Pro 2.8中制作浮雕效果地图,效果如下所示: 【参考阅读】:ArcGIS实验教程——实验四十四:ArcGIS地图浮雕效果制作完整案例教程 1. 加载矢量数据 …

用正则实现多行文本合并,从而保存为csv文件

有如下文本,想实现每三行合并为一行,最终生成csv文件 分数 人数 累计人数 661及以上 23 23 660 3 26 659 5 31 658 5 36 657 9 45 656 10 55 655 4 59 654 6 65 653 15 80查找项: ^(.) ^(.) ^(.)替换项: $1,$2,$3替换结果&…

聊一聊 C# 后台GC 到底是怎么回事?

一:背景 写这一篇的目的主要是因为.NET领域内几本关于阐述GC方面的书,都是纯理论,所以懂得人自然懂,不懂得人也没法亲自验证,这一篇我就用 windbg 源码 让大家眼见为实。二:为什么要引入后台GC 1. 后台GC到…

【BIM入门实战】Revit中的墙体层次以及常见问题解答

一、Revit墙体的层次 1. Revit墙体的层次如图 Revit绘制墙体时,要先选择定位线,可以选核心层中心线,也可以选墙中心线,当墙体为对称时,核心层中心线与墙中心线会重合。 2. 具体层次 1)结构[1]:必须在核心边界内 2)衬底[2]:其他材质基础的材料,如胶合板或石膏板 3…

【系统设计】分布式键值数据库

键值存储 ( key-value store ),也称为 K/V 存储或键值数据库,这是一种非关系型数据库。每个值都有一个唯一的 key 关联,也就是我们常说的 键值对。常见的键值存储有 Redis, Amazon DynamoDB,Microsoft Azure Cosmos DB&#xff0c…

【BIM入门实战】Revit建筑墙体:构造、包络、叠层图文详解

本文主要讲解Revit建筑墙体:构造、包络、叠层。 一、基本墙 第一步: 选择菜单栏的【建筑】选项卡中的【墙】下拉菜单→【属性】面板中切换至基本墙→点击属性面板中的【编辑类型】,弹出如下墙体对话框。 第二步: 选择【复制】按钮→重新进行编辑名称,命名为“外墙-1F-2…

win11 恢复win10开始菜单及任务栏

Windows Registry Editor Version 5.00[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\Advanced] "Start_ShowClassicMode"dword:00000001 "TaskbarSi"dword:00000000将上述代码存为reg文件,双击导入注册表。 任务栏…

CentOS安装Tomcat

1. 下载Tomcat安装包: Tomcat官网 解压下载下来的tar.gz至任意目录下,执行命令: Java代码 tar -xzf apache-tomcat-7.0.56.tar.gz 解压后如图: 如果是在windows上,则直接解压zip包到任意目录&…

【BIM+GIS】ArcGIS Pro2.8如何打开Revit模型,BIM和GIS融合?

ArcGIS Pro2.8中,可以直接打开Revit模型(.rvt)项目文件,实现了从数据格式方面BIM与GIS的有机融合,具体操作如下所示: 1. Revit2018模型绘制 打开Revit2018软件,选择【建筑样板】,打开标高1楼层平面,新建一个简单的户型:包括四面墙体、2个门和一扇窗户,如下图所示。…

Edge 开发者沙龙|一小时精通Edge扩展开发

点击蓝字关注我们编辑:Alan Wang排版:Rani Sun微软 Reactor 为帮助广开发者,技术爱好者,更好的学习 .NET Core, C#, Python,数据科学,机器学习,AI,区块链, IoT 等技术,将…

tomcat 开启远程debug

1、linux服务器上tomcat配置startup.sh 文件末尾添加(不换行):declare -x CATALINA_OPTS"-server -Xdebug -Xnoagent -Djava.compilerNONE -Xrunjdwp:transportdt_socket,servery,suspendn,address9876"2、eclipse配置:…

【测绘程序设计】坐标反算神器V1.0(附C/C#/VB源程序)

【拓展阅读】:【测绘程序设计】坐标正算神器V1.0(附C/C#/VB源程序) 一、坐标反算原理 ​坐标反算:已知两点坐标,反求边长和方位角,称为坐标反算。 原理坐标系: 计算公式: 二、C#程序实现 1. 界面设计 2

ASP.NET Core 6框架揭秘实例演示[01]: 编程初体验

本篇提供的20个简单的演示实例基本涵盖了ASP.NET Core 6基本的编程模式,我们不仅会利用它们来演示针对控制台、API、MVC、gRPC应用的构建与编程,还会演示Dapr在.NET 6中的应用。除此之外,这20个实例还涵盖了针对依赖注入、配置选项、日志记录…