限流不只有计数器,带你快速了解四种经典限流算法实现
🍁 作者:知识浅谈,CSDN 签约讲师,后端领域优质创作者,阿里云社区技术博主,热爱分享创作
📌 擅长领域:全栈工程师、爬虫、ACM 算法
💒 公众号:知识浅谈
🔥 联系方式 vx:zsqtcc
四种经典限流算法实现总结🤞这次都给他拿下🤞
正菜来了⛳⛳⛳
🎈业务中的限流场景
最常见的就三种情况:突发流量,恶意流量,业务本身需要。
🍮突发流量
如我们常见的双十一,京东 618 这些整点秒杀的业务,12306 这些都会出现某段时间面临着大量的流量流入的情况。
🍮恶意流量
比如我们常见的网络爬虫,恶意的流量攻击网站等等,都会产生大量的恶意流量。
🍮业务本身需要
如我们不同版本对流量的控制力度不一样,分别对应着不同的业务。
四种限流大法
温馨提醒:这个有点用,请仔细看下去
🍮基于技术的限流器
📐Eg:在一个时间段内使用一个技计数器记数,当有流量来的时候计数器就加一,在这个时间段内,达到了一定的大小,就会对流量进行控制,每个时间段会重置流量计数器。
📐这个方法,当然是既简单又直观,但有一个很大的问题:我们没法细粒度地控制流量在定时区间内的平滑性,流量依旧可以出现尖刺。
计数器算法会产生临界问题:就比如,在前一个时间段的最后和下一时间段的开始,瞬间到来大量请求打到服务器上,这时候就会出问题。
为了解决上边的临界问题,提出了下边的方法
🍮基于滑动窗口的限流
📐其实这个方法就是把上边的粒度进行切分,切分成更小力度的计数器,就像是上边的切分成一小块一小块,每块时间超出了指定的请求就阻挡在外,越小力度,则限流越好。
📐我们遍历过去一分钟内每个独立区间,也就是每 10 秒内的计数器的计数总和,这个总和当然就是过去一分钟内全部的请求数量了。当然每次经过 10$,我们也自然需要把整个计数区间往右边移动一格。
因为滑动窗口是以内存块一块块存储给内存造成压力,给服务器处理达赖一定负担,所以就有下边的解决方法。
🍮漏桶算法
📐只要我们能让漏洞漏水的消费速度可控、稳定,整个系统只处理漏桶漏出的稳定流量,自然就可以达到限流的效果。漏桶这样严格完美的流量限制策略,也使得它完全放弃了应对突发流量的能力,也是使用定速处理请求的速率。
📐因为如果有突发的流量我们有时候也希望给予一些支持,但是漏桶算法是直接抛弃多余的请求,因此引出了以下方法。
🍮令牌桶算法
📐这个不再是使用定速处理流出的速率,即请求的速率。而是把令牌以稳定的速度放入桶中,请求来时获得令牌桶中的令牌。
📐如果在一段时间内,请求的速度都是高于令牌放入的速度,令牌桶中很快就会没有令牌可用了,服务就会拒绝一部分请求,并保证系统处理的流量在我们的控制范围内。
这个算法已经在 google 中的 guava 使用了。
🍚总结
四种方法终于总结完了,希望对你有所帮助,别忘了素质三联哦。
版权声明: 本文为 InfoQ 作者【知识浅谈】的原创文章。
原文链接:【http://xie.infoq.cn/article/41debf8b178e1fb6f88f807bf】。
本文遵守【CC-BY 4.0】协议,转载请保留原文出处及本版权声明。
评论