波斯马BOSSMA Information Technology

2021年 发布的所有日志

ASP.NET Core中使用漏桶算法限流

发布时间:2021年12月11日 / 分类:ASP.NET, DOTNET / 抢沙发

漏桶算法是限流的四大主流算法之一,其应用场景各种资料中介绍的不多,一般都是说应用在网络流量控制中。这里举两个例子: 1、目前家庭上网都会限制一个固定的带宽,比如100M、200M等,一栋楼有很多的用户,那么运营商怎么保证某些用户没有使用过多的带宽,从而影响到别人...

ASP.NET Core中使用滑动窗口限流

发布时间:2021年12月10日 / 分类:ASP.NET, DOTNET / 抢沙发

滑动窗口算法用于应对请求在时间周期中分布不均匀的情况,能够更精确的应对流量变化,比较著名的应用场景就是TCP协议的流量控制,不过今天要说的是服务限流场景中的应用。 算法原理 这里假设业务需要每秒钟限流100次,先来看固定窗口算法的两个问题: 漏检 如下图...

ASP.NET Core中使用固定窗口限流

发布时间:2021年12月10日 / 分类:ASP.NET, DOTNET / 抢沙发

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

如何使用Redis实现令牌桶算法

发布时间:2021年12月8日 / 分类:Architecture, DOTNET, Redis / 抢沙发

在限流算法中有一种令牌桶算法,该算法可以应对短暂的突发流量,这对于现实环境中流量不怎么均匀的情况特别有用,不会频繁的触发限流,对调用方比较友好。 例如,当前限制10qps,大多数情况下不会超过此数量,但偶尔会达到30qps,然后很快就会恢复正常,假设这种突发流量不...

限流的非常规用途 – 缓解抢购压力

发布时间:2021年12月3日 / 分类:Architecture, DOTNET / 抢沙发

这两年因为疫情,节假日都不怎么外出了,以前每逢节假日都要提前一个月或者半个月抢火车票,人太多的时候会把12306整崩溃。当时很多技术人员指点江山,激扬想法,粪土当年铁科院。 前几年小米手机还很火爆,特别抢手,每每新机发布,人山人海、万人空巷,却往往都在米兔排...

限流的非正式用途 – 解决重复提交问题

发布时间:2021年12月2日 / 分类:Architecture, DOTNET / 抢沙发

问题 在业务应用程序开发中,经常遇到用户重复提交的问题。 比如有一个报名的表单,如果用户不小心连续点击了提交按钮多次,数据库中就可能产生多条报名记录;再或者正常提交后,因为网络或者服务端的原因,前端没有及时收到提交结果,则用户可能认为自己没有提交成功,...

服务限流惩罚是怎么一回事

发布时间:2021年12月1日 / 分类:Architecture, DOTNET / 抢沙发

最近经常看到某某主播被直播平台限流惩罚,平台给主播的流量变少,甚至直接没有流量了。这篇文章要说的是后端服务的限流惩罚,和这个主播被限流惩罚有点相似之处,又有些不同。 本文说的限流惩罚是什么样的? 服务调用者调用服务的次数超过了服务允许的最大上限,也就是...

多租户系统中如何实现分别限流

发布时间:2021年11月30日 / 分类:Architecture, DOTNET / 抢沙发

限流是后端服务开发中经常要集成的一个功能,对于防范系统因压力过大导致崩溃特别有用。在多租户系统中,限流对于限制单个租户使用的资源量也特别有用,这篇文章就来一探究竟。 问题 对于一个多租户系统,某些租户如果使用了过多的资源,很可能会对其它租户造成影响。比...

如何使用数组实现滑动窗口

发布时间:2021年11月29日 / 分类:Architecture, DOTNET / 抢沙发

在FireflySoft.RateLimit之前的版本中,进程内滑动窗口的实现是基于MemoryCache做的,虽然能够正确的实现滑动窗口的算法逻辑,但是性能比较差,其吞吐量只有其它算法的1/4。性能为何如此之差呢? 滑动窗口的原理 我们先来看下滑动窗口的原理,这里给一张图: 如...

.NET6运行时动态更新限流阈值

发布时间:2021年11月16日 / 分类:ASP.NET, DOTNET / 抢沙发

自FireflySoft.RateLimit发布以来,帮助了不少需要在.net中进行限流处理的用户。前段时间有个开发者发了一个pull request,大意是Redis重启的时候Lua script会丢失,但是程序中还认为它存在,所以就会一直抛出异常,那位同学通过捕捉一个特定异常再reload Lua script的方式解...