在一个高并发系统中对流量的把控是非常重要的,当巨大的流量直接请求到我们的服务器上没多久就可能造成接口不可用,不处理的话甚至会造成整个应用不可用。
比如最近就有个这样的需求,我作为客户端要向kafka生产数据,而kafka的消费者则再源源不断的消费数据,并将消费的数据全部请求到web服务器,虽说做了负载(有4台web服务器)但业务数据的量也是巨大的,每秒钟可能有上万条数据产生。如果生产者直接生产数据的话极有可能把web服务器拖垮。
对此就必须要做限流处理,每秒钟生产一定限额的数据到kafka,这样就能极大程度的保证web的正常运转。
其实不管处理何种场景,本质都是降低流量保证应用的高可用。
常见算法
对于限流常见有两种算法:
漏桶算法比较简单,就是将流量放入桶中,漏桶同时也按照一定的速率流出,如果流量过快的话就会溢出(漏桶并不会提高流出速率)。溢出的流量则直接丢弃。
如下图所示:
这种做法简单粗暴。
漏桶算法虽说简单,但却不能应对实际场景,比如突然暴增的流量。
这时就需要用到令牌桶算法:
令牌桶会以一个恒定的速率向固定容量大小桶中放入令牌,当有流量来时则取走一个或多个令牌。当桶中没有令牌则将当前请求丢弃或阻塞。
相比之下令牌桶可以应对一定的突发流量.
RateLimiter实现
对于令牌桶的代码实现,可以直接使用Guava包中的RateLimiter。
调用结果如下:
代码可以看出以每秒向桶中放入两个令牌,请求一次消耗一个令牌。所以每秒钟只能发送两个请求。按照图中的时间来看也确实如此(返回值是获取此令牌所消耗的时间,差不多也是每500ms一个)。
使用有几个值得注意的地方:
允许先消费,后付款,意思就是它可以来一个请求的时候一次性取走几个或者是剩下所有的令牌甚至多取,但是后面的请求就得为上一次请求买单,它需要等待桶中的令牌补齐之后才能继续获取令牌。
总结
针对于单个应用的限流够用了,如果是分布式环境可以借助Redis来完成。
如今业务越来越多地依赖于网络,尤其是在数字化转型为虚拟和远程运营推动新常态...
【51CTO.com原创稿件】以39套的成绩名列榜首,第五次获得HPC TOP100 NO.1,这是...
随着网络的发展,整个基础架构也在发展。网络管理不善会严重影响企业所依靠的所...
1.风勾起了往事沧桑,雨泛白了爱恨情长。谁也无法抹去隐藏在最心底的那道伤。古...
自从Alpha GO战胜人类围棋选手以来,AI就成为了整个商业社会中热度***的一个名词...
CoreDNS 是新晋的 CNCF 孵化项目,前几天已经从 CNCF 正式毕业,并正式成为 Kube...
5G、云计算、AI、大数据、物联网等等词汇,早已闯入大众视线。在当前新基建起势...
因为电子商务网站的浏览量较为大,因此网站的速度、安全系数都不可忽视。而服务...
2月23日至25日,世界移动通信大会(MWC 2021)在上海盛大召开。作为移动通信领域的...
随着应用程序处理的数据量不断增长,扩展存储变得愈发具有挑战性。每个数据库系...