波斯马BOSSMA Information Technology

DOTNET 下的日志

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

发布时间: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的方式解...

ASP.NET Core中使用令牌桶限流

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

在限流时一般会限制每秒或每分钟的请求数,简单点一般会采用计数器算法,这种算法实现相对简单,也很高效,但是无法应对瞬时的突发流量。 比如限流每秒100次请求,绝大多数的时间里都不会超过这个数,但是偶尔某一秒钟会达到120次请求,接着很快又会恢复正常,假设这种突发...

Lazy(Func)的异常缓存问题

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

Lazy可以提供多线程环境下的安全保障,但是用不好也是会跳到坑里。 我这里使用Lazy<t>(Func<T>)来创建一个Lazy实例,然后在需要的地方访问它的Value属性,它可以保证在多线程环境下Func<T>仅执行一次,这看起来十分的美好:需要的时候执行,并且仅执行一次,再翻...

ASP.NET Core中如何对不同类型的用户进行区别限流

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

老板提出了一个新需求,从某某天起,免费用户每天只能查询100次,收费用户100W次。 这是一个限流问题,聪明的你也一定想到了如何去做:记录用户每一天的查询次数,然后根据当前用户的类型使用不同的数字做比较,超过指定的数字就返回错误。 嗯,原理就是这么简单。不过...

FireflySoft.RateLimit使用与原理

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

限流一般是为了解决因拥挤导致服务无法正常提供的问题。比如常见的地铁限流,如果很多人在很短的时间内快速涌入,超出站台内的空间或列车的可运载人数,就会容易引发安全事故。 在github上使用C#编写的限流程序有很多,翻看了一些,大部分都有很多的场景限制,比如只能用在...