限流的算法有哪些?

限流的算法有哪些?

主要有四种,感觉和之前学习计算机网络时,好像也有一个滑动窗口,可以去看看

1.固定窗口计数器算法
在这里插入图片描述

先上图,图中以每分钟为一个周期,即固定时间窗口,单个窗口请求限制数量为3个,未超出允许通过,超出的被丢弃。
官方说法。。。
规定我们单位时间处理的请求数量。比如我们规定我们的一个接口一分钟只能访问10次的话。使用固定窗口计数器算法的话可以这样实现:给定一个变量counter来记录处理的请求数量,当1分钟之内处理一个请求之后counter+1,1分钟之内的如果counter=100的话,后续的请求就会被全部拒绝。等到 1分钟结束后,将counter回归成0,重新开始计数(ps:只要过了一个周期就讲counter回归成0)。

感觉有弊端,没有办法限制速率,想要达到的效果是可以把这个N次请求较为平均的分布在时间区间里,接着往下看。
咦,还有一个弊端,虽然单个窗口没有超出限制,但是如果一次请求集中在时间区间后半段,下一刚好集中在时间区间的前半段,这个两个一拼,从另一个角度看是允许限制的两倍。
在这里插入图片描述

2.滑动窗口计数器算法

这种算法避免了固定窗口计数器带来的双倍突发请求,但时间区间的精度越高,算法所需的空间容量就越大。每次有新的请求就以此为基准生成一个新的时间限制区间,然后看在该区间内的请求是否超过限制。
在这里插入图片描述

3.漏桶算法
在这里插入图片描述

漏桶算法概念如下:

将每个请求视作"水滴"放入"漏桶"进行存储;
“漏桶"以固定速率向外"漏"出请求来执行如果"漏桶"空了则停止"漏水”;
如果"漏桶"满了则多余的"水滴"会被直接丢弃。

漏桶算法多使用队列实现,服务的请求会存到队列中,服务的提供方则按照固定的速率从队列中取出请求并执行,过多的请求则放在队列中排队或直接拒绝。

漏桶算法的缺陷也很明显,当短时间内有大量的突发请求时,即便此时服务器没有任何负载,每个请求也都得在队列中等待一段时间才能被响应。

嗯,这个方案听起来还不错,但是无论服务器压力大不大速度都被限制住了,还有没有更好的方案…

4.令牌桶算法
在这里插入图片描述

令牌桶算法概念如下:

令牌以固定速率生成;
生成的令牌放入令牌桶中存放,如果令牌桶满了则多余的令牌会直接丢弃,当请求到达时,会尝试从令牌桶中取令牌,取到了令牌的请求可以执行;
如果桶空了,那么尝试取令牌的请求会被直接丢弃。

令牌桶算法既能够将所有的请求平均分布到时间区间内,又能接受服务器能够承受范围内的突发请求,而且当服务器请求不大时请求速率也会快一些,因为虽然令牌还是以固定速率生成的,但是可以积攒在桶中,压力比较小时积攒的令牌会比较多,可以直接拿令牌用,不会浪费时间等待(此时规避了漏桶算法以固定速率流出的问题),因此是目前使用较为广泛的一种限流算法。

参考链接:
https://www.infoq.cn/article/Qg2tX8fyw5Vt-f3HH673
https://xiaozhuanlan.com/topic/2895047136#section-1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值