首页 > 作文

解决ASP.NET Core中使用漏桶算法限流的问题

更新时间:2023-04-04 02:20:16 阅读: 评论:0

目录
算法原理算法实现进程内即内存漏桶算法基于redis的漏桶算法应用算法1、安装nuget包2、使用中间件

漏桶算法是限流的四大主流算法之一,其应用场景各种资料中介绍的不多,一般都是说应用在网络流量控制中。这里举两个例子:

1、目前家庭上网都会限制一个固定的带宽,比如100m、200m等,一栋楼有很多的用户,那么运营商怎么保证某些用户没有使用过多的带宽,从而影响到别人呢?这时就可以使用漏桶算法,限制每个用户访问网络的最大带宽,当然实际会比这复杂很多。

2、有一个祖传接口,当时写的时候没有任何保护措施,现在访问量稍微大点就会崩溃,但是代码谁也改不动。这时候也可以用漏桶算法,把这个接口封装一下,将外部请求通过漏桶算法进行整流,再转发给这个接口,此时访问频率不会超过阈值,接口就不会崩溃了。

算法原理

说了这么多,那漏桶算法到底是怎么解决问题的呢?请看下图。

接收到请求后,先把请求放到一个漏桶中,漏桶以恒定的速率漏出请求,然后漏出的请求被处理;如果接收请求的速度过快,导致漏桶满了,则丢弃新的请求。

可以看出,漏桶算法主要是通过恒速的方式输出,给后续数据处理一个稳定的输入。这样它就能应对一定的突发流量,使系统不会因为请求量突增而导致崩溃,只不过是通过增加延迟的方式,会有那么一点浪费资源,这和令牌桶张显富的处理方式不同,关于令牌桶算法可以看这篇文章:asp.net core中使用令牌桶限流。

还有一个不常提及的好处,恒速的输出有时候也可以提升效率,比如一次允许漏出两个请求,则可以将两次处理合并为一次处理,如果每次处理都涉及到网络io,则合并处理就有机会减少网络io的开销。

算法实现

这里讲两种实现方法:进程内即内存漏桶算法、基于redis的漏桶算法。

进程内即内存漏桶算法

这里在请求时计算漏出数量,没有单独的漏出处理,描述的算法稍显复杂,不过只需要增加一点耐心,也很容易理解。

先来定义几个变量:

对于漏出速率,用 [每x时间周期y个] 来表示。x时间周期一般是若干秒、分钟、小时等时间跨度。对于当前时间周期的开始时间用ts表示,当前时间周期的结束时间用te表示,当前时间用ti表示。对于漏桶容量,用z来表示。对于x时间内的所有请求数量,用n来表示。

当请求到达时,则可以按以下次序处理:

如果ti-ts<=x,说明还在当前时间周期内,先增加n的值:

比较n和y,如果n<=y,则请求无需等待,直接漏出,进入处理阶段;

如果n>y,则比较n与y+z:

如果n<=y+z,则请求进入漏桶等待,等待时间为:(math.ceiling((n-y形容笑容的成语)/y)-1)*x+(te – ti),等待结束后漏出,进入处理阶段;

如果n>y+z,则请求无法进入漏桶,只能丢弃掉,实现上就是拒绝请求;

如果ti-ts>x,则需要创建新的时间周期:

计算过去了几个时间周期:pn=math.ceiling((ti-te)/x);

重设ts和te的值:ts=上次的ts+pn*x,te=ts+x;计算这段时间最大可以漏出的数量:yo=pn*y;计算n的值:n= n-yo<=0 ? 0: n-yo;此时符合ti-ts<=x,又在当前时间周期内了,再回到上边的步骤依次处理。

基于redis的漏桶算法

基于redis也可以实现上述的算法,只不过变量的表示方式换成了redis kv,算法逻辑还是一样的。

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

应用算法

虽然业务服务中不怎么常用,这里还是以限流组件 fireflysoft.ratelimit 为例,实现asp.net core中的漏桶算法限流。

1、安装nuget包

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

包管理器命令:

install-package fireflysoft.ratelimit.aspnetcore

或right on者.net命令:

dotnet add package fireflysoft.ratelimit.aspnetcore

或者项目文件直接添加:

<itemgroup><packagereference include="fireflysoft.ratelimit.aspnetcore" version="2.*" /></itemgroup>

2、使用中间件

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

public void configurervices(irvicecollection rvices)        {           ...           app.addratelimit(new inprocessleakybucketalgorithm(                new[] {                // 三个参数:漏桶的容量、单位时间漏出的数量、漏出的单位时间                    new leakybucketrule(20,10, timespan.fromconds(1))                    {                        extracttarget = context =>                        {                        // 提取限流目标                            return (context as httpcontext).request.path.value;                        },                        checkrulematching = context =>                        {                        // 判断当前请求是否需要限流处理                            return true;                        },                        name="leaky bucket limit rule",               民事诉讼法试题     }                })            );            ...        }public void configure(iapplicationbuilder app, iwebhostenvironment env)        {            ...            app.uratelimit();            ...        }

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

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

这里使用进程内漏桶算法inprocessleakybucketalgorithm,还可以使用redisleakybucketalgorithm,需要传入一个redis连接。两种算法都支持同步和异步方法。漏桶的容量是20,单位时间漏出的数量10,漏出的单位时间是1秒。也就是说1秒漏出10个,1秒内超出10个请求就会被延迟处理,加上漏桶的容量,1秒内超出30个请求就会被限流。extracttarget用于提取限流目标,这里是每个不同的请求path,可以根据需求从当前请求中提取关键数据,然后设定各种限流目标。如果有io请求,这里还支持对应的异步方法extracttargetasync。checkrulematching用于验证当前请求是否限流,传入的对象也是当前请求,方便提取关键数据进行验证。如果有io请求,这里还支持对应的异步方法checkrulematchingasync。默认被限流时会返回httpstatuscode 429,可以在addratelimit时使用可选参数error自定义这个值,以及http header和body中的内容。

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

如果还是基于传统的.net framework,则需要在application_start中注册一个消息处理器ratelimithandler,算法和规则部分都是共用的,具体可以看github上的使用说明:https://github.com/bosima/fireflysoft.ratelimit

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

其主要特点包括:

多种限流算法:内置固定窗口、滑动窗口、漏桶、令牌桶四种算法,还可自定义扩展。多种计数存储:目前支持内存、redis两种存储方式。分布式友好:通过redis存储支持分布式程序统一计数。限流目标灵活:可以从请求中提取各种数据用于设置限流目标。支持限流惩罚:可以在客户端触发限流后锁定一段时间不允许其访问。动态更改规则:支持程序运行时动态更改限流规则。军校生活自定义错误:可以自定义触发限流后的错误码和错误消息。普适性:原则上可以满足任何需要限流的场景。

github开源地址:https://github.com/bosima/fireflysoft.ratelimit

到此这篇关于asp.net core中使用漏桶算法限流的文章就介绍到这了,更多相关asp.net core限流内容请搜索www.887551.com以前的文章或继续浏览下面的相关文章希望大家以后多多支持www.887551.com!

本文发布于:2023-04-04 02:18:32,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/zuowen/f1e409a5c8a934359918bda98cbe66b9.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

本文word下载地址:解决ASP.NET Core中使用漏桶算法限流的问题.doc

本文 PDF 下载地址:解决ASP.NET Core中使用漏桶算法限流的问题.pdf

下一篇:返回列表
标签:算法   时间   漏出   周期
相关文章
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图