.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)”的概念。

  • 一个段是一个窗口的一部分,如果将前面 2 小时的窗口分成 4 个段,则会有 4 个 30 分钟的段。此外还有一个“段索引”,它始终指向窗口中的最新段。
  • 30 分钟内的请求进入最新的段,且每 30 分钟窗口滑动一个段。如果在窗口滑过段期间出现了新的请求,则该请求会被刷新,且段的最大限制会增加。如果没有请求,则段的限制保持不变。

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

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

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

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

 

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


相關推薦

2023-04-01

包括: Fixed 更新rate测试的偏差值为8 Enhancements 新增-max_tran_rate命令行参数来支持在客户端和服务端限制最大传输速率 新增core.FlagSet结构,避免使用全局的flag.CommandLine 移除hashutil、server、httputil、ignore、daemon、conf和re

2023-09-02

新特性 新增 额外参数v2 插件,支持对转发参数进行加密、拼接等操作。 该插件为额外参数插件的升级版本,在v1版本中,我们只能设置静态参数转发给上游服务,存在一定的局限性。 在某些场景,如:对参数进行

2023-02-19

= 和 ReloadLimitBurst= 选项控制执行守护程序重新加载的最大速率。 Systemd 现在在“沙盒”挂载命名空间中执行生成器,其中大部分文件系统都是只读的,只对输出目录和临时 /tmp 挂载点进行写访问。 Type=notify-reload 的新单元

2022-11-27

ence4j-circuitbreaker: Circuit breaking resilience4j-ratelimiter: Rate limiting resilience4j-bulkhead: Bulkheading resilience4j-retry: Automatic retrying (sync and async) resilience4j-cache: Response caching

2023-01-13

表现在使用 GPU 进行渲染 效果现在以更高、更平滑的帧速率运行,以前的更新速度被限制在每秒 20 帧。 …… 更多详情可查看:https://www.getpaint.net/roadmap.html

2023-04-04

修复mysql下报表统计异常问题,优化显示数量问题。 【新增】图片的【裁剪上传】模式增加上传文件流大小验证机制。限制用户裁剪过大图片。 【修复】修复商品勾选扩展分类后,前端扩展分类不显示商品的问题。 【升级

2022-09-04

dotnetchina/Furion/issues/I5PCXK 本期更新 新特性 [新增] AppSettings 配置的 ExcludeAssemblies 属性,支持忽略指定程序集扫描 7b7747f [新增] Oops.Oh 和 Oops.Bah 支持设置额外数据 .WithData(data) 

2023-11-22

了 Social preset 在更短的时间内实现更高的质量和帧速率,无需隔行检测和删除 更适合实时社交短片和屏幕/游戏捕获的现代社交共享 删除了 Email presets,以支持修订后的 Social presets 停止通过电子邮件发送视频或使

2022-11-08

等功能测试能力外,在目前正在开发的 1.9.0 版本中,还新增了一个帮助页面。该页面不仅提供了查看和使用 MQTT X 的文档链接,还提供了 MQTT 基础入门系列与实践编程系列的内容模块,帮助一些正在学习或初次接触到 MQTT 的用户

2022-05-03

年兽等各种互动业务中的图形引擎。 0.7 版本在图形方面新增了文字渲染器,完善了 2D 的基础能力,同时增强了 PBR 材质渲染效果,让真实感渲染效果更上一层楼。物理方面,深入结合 PhysX 的能力引入动态碰撞器组件,帮助

2023-04-04

93421 使 native inference 普遍可用#92213 TSDB 添加 TSDB 速率聚合#90447 Downsampling GA #92913 将 time_series 和 rate(在计数器字段上)聚合发布为技术预览#93546 时间序列 (TSDS) GA #91519 Transform 转换 _schedule_now API #9

2022-06-28

更新内容如下: 变化 -rate 这个新的命令行选项 rate 限制了每个时间段的传输次数。 弃用 -random-file 和 -egd-file 这两个选项已经有很长一段时间没有人使用了,从现在开始,它们已经没有任何功能了,使用它们不会有任何

2023-05-24

创建专业级海报的重要性,但常常面临时间和设计技能的限制。现在,Fastposter海报生成器为我们提供了一个简单而高效的解决方案。 Fastposter是一款功能强大、易于使用的海报生成器,旨在为技术人员、设计师和创作者提供便

2023-07-20

息,请参见设置LDAP可插拔身份验证的超时时间。 除了新增功能外,还做了以下调整,这部分内容基本上与 MySQL8.0.34 一致。 用户管理方面,增加了一个系统变量“validate_password.changed_characters_percentage”用于密码验证。该变量用