ASP.NET Core中使用令牌桶限流
在限流时一般会限制每秒或每分钟的请求数,简单点一般会采用计数器算法,这种算法实现相对简单,也很高效,但是无法应对瞬时的突发流量。
比如限流每秒100次请求,绝大多数的时间里都不会超过这个数,但是偶尔某一秒钟会达到120次请求,接着很快又会恢复正常,假设这种突发的流量不会对系统稳定性带来实质性的影响,则可以在一定程度上允许这种瞬时的突发流量,从而为用户带来更好的可用性体验。这就是令牌桶算法的用武之地。
该算法的基本原理是:有一个令牌桶,容量是X,每Y单位时间会向桶中放入Z个令牌,如果桶中的令牌数超过X,则丢弃令牌;请求要想通过首先需要从令牌桶中获取一个令牌,获取不到令牌则拒绝请求。可以看出对于令牌桶算法X、Y、Z这几个数的设定特别重要,Z应该略大于绝大数时候的Y单位时间内的请求数,系统会长期处于这个状态,X可以是系统允许承载的瞬时最大请求数,系统不能长时间处于这个状态。
这里介绍一个ASP.NET Core的中间件来满足令牌桶限流需求:FireflySoft.RateLimit.AspNetCore。使用步骤如下:
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 InProcessTokenBucketAlgorithm(new[] {new TokenBucketRule(30,10,TimeSpan.FromSeconds(1)){ExtractTarget = context =>{return (context as HttpContext).Request.Path.Value;},CheckRuleMatching = context =>{return true;},Name="default limit rule",}}));...}public void Configure(IApplicationBuilder app, IWebHostEnvironment env){...app.UseRateLimit();...}
如上需要先注册服务,然后使用中间件。
注册服务的时候需要提供限流算法和对应的规则:
这里使用进程内令牌桶算法,对于分布式服务还可以使用Redis令牌桶算法,支持StackExchange.Redis。
桶的容量是30,每秒流入10个令牌。
ExtractTarget用于提取限流目标,这里是每个不同的请求Path。如果有IO请求,这里还支持对应的异步方法ExtractTargetAsync。
CheckRuleMatching用于验证当前请求是否限流。如果有IO请求,这里还支持对应的异步方法CheckRuleMatchingAsync。
默认被限流时会返回HttpStatusCode 429,可以在AddRateLimit时使用可选参数error自定义这个值,以及Http Header和Body中的内容。
基本的使用就是上边例子中的这些了。
另外这个项目也支持.Net Framework,需要安装另一个包 FireflySoft.RateLimit.AspNet,如果你的程序基于.net 4.x,可以选择这个版本。
同时在非Web应用场景也有对应的包支持:FireflySoft.RateLimit.Core ,只不过需要自己处理限流结果。
他们的使用方法都很类似,逻辑也很简单,都是需要先创建一个算法实例,然后通过这个实例去检查每一次请求,根据业务需要处理检查结果就可以了。
ASP.NET Core中使用令牌桶限流相关推荐
- ASP.NET Core中使用滑动窗口限流
滑动窗口算法用于应对请求在时间周期中分布不均匀的情况,能够更精确的应对流量变化,比较著名的应用场景就是TCP协议的流量控制,不过今天要说的是服务限流场景中的应用. 算法原理 这里假设业务需要每秒钟限流 ...
- 如何在 Asp.Net Core 中对请求进行限流
译文链接:https://www.infoworld.com/article/3442946/how-to-implement-rate-limiting-in-aspnet-core.html 在应 ...
- Jedis使用lua脚本完成令牌桶限流
Jedis使用lua脚本完成令牌桶限流 文章目录 Jedis使用lua脚本完成令牌桶限流 一.lua脚本的简单语法 二.令牌桶限流 1. 构思 2. 实现 三.Jemeter压测工具测试 一.lua脚 ...
- 可能要用心学高并发核心编程,限流原理与实战,分布式令牌桶限流
实战:分布式令牌桶限流 本节介绍的分布式令牌桶限流通过Lua+Java结合完成,首先在Lua脚本中完成限流的计算,然后在Java代码中进行组织和调用. 分布式令牌桶限流Lua脚本 分布式令牌桶限流Lu ...
- 【秒杀系统】零基础上手秒杀系统(二):令牌桶限流 + 再谈超卖
前言 本文是秒杀系统的第二篇,通过实际代码讲解,帮助你快速的了解秒杀系统的关键点,上手实际项目. 本篇主要讲解接口限流措施,接口限流其实定义也非常广,接口限流本身也是系统安全防护的一种措施,暂时列举这 ...
- 什么是限流?为什么会限流呢?常见的限流算法【固定窗口限流、滑动窗口限流、漏桶限流、令牌桶限流】是什么呢?
什么是限流?为什么会限流呢?常见的限流算法[固定窗口限流.滑动窗口限流.漏桶限流.令牌桶限流]是什么呢? 什么是限流? 为什么会限流? 1. 固定窗口限流算法 1.1 什么是固定窗口限流算法 1.2 ...
- 基于Redis和 Lua 实现分布式令牌桶限流
rpc-tech-stack 系列的实践文章 ~ 本文属于限流话题. 限流是一个很大的话题,准备把其中的所有限流器都实现一遍,以此也算全都写过了,到时候再用也不至于会心虚,毕竟真实写完成过.本文主要讲 ...
- 令牌桶限流之redis-cell的安装,使用,详解
简言 1. redis使用有序集合zset也能实现简单的限流,但是只能处理几十,几百的量级,因为zset需要记录每一条信息,很占据空间.要想处理更大数量级的限流,必须使用其他方法 2. 通常的限流算法 ...
- rateLimiter令牌桶限流算法
RateLimiter是guava提供的基于令牌桶算法的实现类,可以非常简单的完成限流特技,并且根据系统的实际情况来调整生成token的速率. 通常可应用于抢购限流防止冲垮系统:限制某接口.服务单位时 ...
最新文章
- 【 Linux 】Vim学习指南
- zTree第二章,各种常见setting设置和方法
- 借助Ant工具,实现快速开发
- WeChat微信小程序image组件aspectFill:保留中部 等比例变化 Widthfix:宽度为指定的 高度依据原图的宽高比进行变化
- Ubuntu中vi / vim编辑器快捷操作
- 程序员过关斩将--领导说我的类的职责不单一
- String.valueOf(Object)与Objects.toString(Object)
- 西门子atch指令详解_西门子plc指令
- 基于单片机的功放protues_基于单片机的功放毕业设计
- qcloud php开发,GitHub - QcloudApi/qcloudapi-sdk-php
- linux基本概念知识整理
- 你们想要知道的跳一跳都在这了,23333333
- python用pandas读取excel_Python 中利用Pandas处理复杂的Excel数据
- HTTP协议的理解和使用
- c语言编写词库_C语言课程设计--电子生词库软件
- 量化投资学习必读书目(八)——《短线交易大师》
- Java MD5和SHA256等常用加密算法
- 剑网三服务器一直未响应,《剑网3》大师赛第二个比赛日赛后采访回顾
- linux sendmail
- 自制操作系统-最简单的系统hello World