常见限流算法

举报
object 发表于 2024/03/15 10:27:47 2024/03/15
【摘要】 限流算法,web系统的开发经常免不了限流控制,对于系统的安全性如dos攻击以及稳定性都是有极大的必要性。一、固定窗口计数器算法定义:限制单位时间内可请求的最大值。当然我们有可以从这个名字来理解,  以时间轴作为窗子的底边,每一段单位时间就是一个窗子,这条时间轴上有无数个固定的窗子,窗子与窗子之间无关联关系,与之相对的就是滑动窗口。举例说明: 1分钟内允许100个请求。   则每1分钟作为一个...

限流算法,web系统的开发经常免不了限流控制,对于系统的安全性如dos攻击以及稳定性都是有极大的必要性。

一、固定窗口计数器算法

定义:限制单位时间内可请求的最大值。

当然我们有可以从这个名字来理解,  以时间轴作为窗子的底边,每一段单位时间就是一个窗子,这条时间轴上有无数个固定的窗子,窗子与窗子之间无关联关系,与之相对的就是滑动窗口

举例说明: 1分钟内允许100个请求。   则每1分钟作为一个窗子,高度为100。 第一分钟内,如果超过100个请求,则多余的就会被抛弃,直到第二分钟开始,计数重新开始。

实现:一个计时器  一个计数器

优点:实现简单

缺点:限流不够平滑,无法应对激增流量。

    “平滑”:在某一段时间内可能长时间导致请求无法处理      “激增流量”:大量的并发请求,虽然1分钟内可以处理100个请求,但是浓缩到1s,则可能无法处理100个请求。

二、滑动窗口计算器限流

这个是相对固定窗口而言的。特点就是滑动了。 

固定窗口是时间轴上有无数个一模一样的窗子,彼此无关联,  滑动窗口就是时间轴上始终只有一个窗子,这个窗子可以滑动。  滑动速率是限制的,以固定的速度进行滑动。

举例说明:依旧是1分钟允许请求100个请求, 这是窗子的总大小。滑动窗口进行了优化,将一分钟划分成10份,每份10s,则每10秒允许的请求数为 100/10 = 10。当60s内,每个区间记录自己区间的请求数,当跨过60s后,则左边第一个10s区间就会被抛弃,然后右边纳入一个新的一个10s区间,整体看起来就是窗子右移了一下,移动的跨度为10s。

上述讲了固定窗口限流的缺点之一。不够平滑,不能应对激增流量。  现在改动后,平滑度升高了, 激增流量的限制也提高了。 

实现:多个计时器,多个计数器

优点:平滑度提高,跟跨度成反比,跨度越小,平滑度越高,不过性能消耗也越高。

缺点:平滑度,激增流量受限跨度的设置

三、漏桶算法

漏桶算法主要体现在"漏桶"两个字,想象一下,你用一个漏桶去装水,水再多,它始终保持一定的速率漏水,如果装水速度大于漏水,则水满了,多余水则无法入桶。

对比到请求限流中,就是允许任意量的请求访问,系统始终以匀速的速度进行处理请求,如果超出预定设置的请求数容量,则拒绝后来的容量。

举例说明:系统1s处理1个请求,这就是漏桶的漏水速度,允许最多100个请求连接,则100就是桶的容量。 至于这100个请求是以什么样的速率进行访问则不进行限制,1s种也好,100s也好,超过100个则后续的直接拒绝,直到1s后处理了一个请求,又允许一个请求连接。

实现: 一个计时器    一个队列


漏桶算法其实就是常说的队列削峰/限流,通过队列限制最大请求数,定期从队列中去进行消费。

优点:相比于窗口算法,他可以控制漏桶流速,避免同时涌入大量请求导致系统过载。  

缺点:对系统的资源利用不够,始终以一定速度进行处理

四、令牌桶算法

令牌桶个人感觉不是很贴切,不过他是基于漏桶算法的升级,延用这个名字也能理解,所以要理解令牌桶,要先了解漏桶算法。

令牌桶的桶不是漏桶,它是一个完整的桶,这是一个区别,桶里面装的也不再是“请求”了,而是一个叫“令牌”的东西。令牌的作用就是当请求过来时,请求需要先去桶里面拿令牌,拿到令牌的请求,就会被系统处理,没有拿到的,就会被拒绝。

令牌桶跟漏桶的区别:1.漏桶的漏水 改成了 令牌的生成  2.漏桶的容量 改成了 令牌的数量 

实现:队列 + 计时器

优点:解决了漏桶始终匀速处理的问题,令牌成成速度可动态调整,增加了资源利用性。

缺点:由于令牌速率和桶的容量决定了系统的并发处理能力,需要合理设置,否则容易导致并发量过大,系统过载。

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。