你所在的位置: 首页 > 正文

Java后端精选技术:高并发场景下的限流策略

2019-09-17 点击:928

在高并发场景中,我们优化和保护系统的方法通常包括:多级缓存,资源隔离,排污,限流等。

今天我们要谈谈目前的限制。

举一个简单的例子,通常,员工A每天可以处理10个工作,并且突然在某一天有100个工作负载。此时,如果员工A仍处理100,则只有一种可能性。这名员工被粉碎了。

如果我们事先能够知道将会有100个任务,我们将通过增加员工数量或定义消息队列来临时解决这些问题。

但很多时候我们无法预测这些事故。根据墨菲定律,经常会出现不好的事情,并且有可能某个点会挂起(雪崩)。所以我们必须为我们的系统做一些保护。限流是其中之一。

对于尖峰情况,我们还可以在不影响整个系统的情况下执行一些限流措施。

想法:速度限制,我们可能会想到的第一件事是我使用计数器来执行该技术。如果超过计数器阈值,则速度太快。每秒一个计数器。

为了阅读起见,我只拍了主代码片段的截图。

这有一个问题:粒度太大,不均匀,不到1秒,没有办法区分。

我们可以分割粒度并在1秒内将其分成10 100毫秒。每100毫秒有一个计数器。为了理解TCP/IP,TCP/IP具有所谓的“滑动窗口协议”,以便提高传输速度并控制传输速度。

即使它被分解,也不能解决速度均匀限制的问题。

如果你在一秒钟内限制10个请求,在第一秒和第二秒之间限制10个请求,在第一秒的后半部分限制10个请求,在第二秒的前半部分限制10个请求,第一个在第二个下半场的一半+第二秒的下半场,一秒内有20个请求,这不起到限速的作用。

有没有更好的办法?

在生活中,如果一个水桶有一个好眼睛,我们用水填充它,我们可以看到水以恒定的速率下降,这可以通过该程序实现这种方式。

想法:水桶是一个容器,一滴水是一个要求。如果存储桶已满,则拒绝该请求并且请求未满。

代码段

在段落代码

首先计算当此请求和最后一个请求到来时泄漏了多少水。看看水桶里剩下多少水,以及它是否溢出。如果请求被拒绝,则表示未添加当前丢弃。处理请求。对于许多应用场景,除了能够限制数据的平均传输速率之外,还需要允许一定程度的突发传输。此时,漏桶算法可能不合适,并且令牌桶算法更合适。

那是什么意思?也就是说,我在服务之前已经闲置了很长时间,突然传来很多请求(在桶的容量内),我必须快速处理这个问题。

想法:以恒定速率生成令牌,将它们扔进桶中,并每次请求查看是否有任何额外令牌。如果有令牌来执行正常业务,则没有速度限制。

代码段

以这种方式,可以立即允许大量处理,然后执行速度限制处理。

请求到来时,首先计算当前放置在存储桶中的令牌数。这里,令牌可以以恒定速度放置而无需启动线程。这称为延迟计算。然后计算存储桶所具有的令牌数。然后获取令牌。拒绝或处理行动。

上面的代码可以在Github上查看。

安利每个人都有一个有效的限速器。

Google的基础库guava包含基于令牌桶的速率限制器RateLimiter。使用起来也很简单。

文章来源地址:

作者:Hollis

http://www.sugys.com/bds5Ca3.html

楚汉新闻 版权所有© www.airkatknives.com 技术支持:楚汉新闻 | 网站地图