限流基础知识介绍 限流是什么意思


限流基础知识介绍 限流是什么意思

文章插图
电流限制是什么意思(电流限制基础知识介绍)
我之前读书的时候没接触过高并发/高流量这种东西,所以当然没接触过限流 。看公司的项目时,发现用费率限制器很有用,顺便了解了一下 。
一、限流基础知识介绍为什么要限流,我就不用多说什么了 。
比如周末去餐厅吃饭,但是人太多了,只能去前台取号,直到号到我这里才能进餐厅吃饭 。酒店没有限流怎么办?饭一到,大家就冲进去,酒店处理不了这么多人,很容易出事(酒店住满了人,没有出路 。酒店工作人员崩溃处理不了)
回到代码世界,情况也是如此 。服务器可以处理的请求数量是有限的 。如果请求的数量非常大,我们需要限制电流(要么让请求等待,要么丢弃它们) 。
在代码领域,有两种常见的限流算法:
令牌桶算法
漏桶
1.1什么是漏桶?
举个例子,现在我有一个水桶,绿色的是我能装水的容量 。如果超过了我所能容纳的容量信息资源网,再往桶里倒水,就会溢出(限流):

目前我们能知道的是:
水桶的容量是固定的(就是图中绿色的那个) 。
如果超过桶的容量,就会溢出(要么等待,要么直接丢弃) 。
好了,现在让我们在水桶上挖一个洞,这样水就可以从洞里流出来了:

水桶孔的大小是固定的,所以水从孔中流出的速度也是固定的 。
所以总结一下,算法需要两个参数:
【限流基础知识介绍 限流是什么意思】腹部容积
漏水率
漏桶有两种实现方式:
不允许突然流动:如果进水的速率大于出水的速率,多余的水会直接丢弃 。举个例子,我的水桶可以装100L,但是我的水桶的出水速率是10 L/s,这时候如果现在有100L/s的水进来,我就只让10 L的水进桶,其余的都被限制 。(限制请求的速度)
允许一定量的突然流动:我的桶能装100L 。如果我的桶现在是空,这100 L的水可以全部进我的桶 。我以10L/s的速度排水,如果信息资源网有100L的水,我只能限制流量 。
经过以上分析,我们知道:
漏桶可以平滑网络上的突发流量(因为漏水率是固定的) 。
1.2什么是令牌桶算法
现在我又多了一桶 。这个桶是用来装代币而不是水的:

代币以一定的速率投入桶中 。例如,我在一秒钟内向桶里扔10个代币:

一个桶中可以容纳的令牌数量有上限 。比如我的桶最多只能装1000个代币 。
每次有请求进来,我都会去桶里拿个令牌 。
比如我这一秒有1001个请求,我就去桶里拿1001个令牌 。这时,可能会出现两种情况:
桶里没有1001令牌,只有1000,所以没有得到令牌的请求只能被阻塞(等待) 。
桶中有1001个令牌,所有请求都可以执行 。

令牌桶算法支持网络上的突发流量 。
* *漏桶和令牌桶的区别:* *从上面的例子可以看出,漏桶只能处理固定速率的请求,而令牌桶可以处理桶内令牌数最大的请求 。
第二,限速器的使用RateLimiter是番石榴的一个限流组件,在我的系统中使用,使用起来非常方便 。
介绍pom依赖关系:

RateLimiter基于令牌桶算法,API非常简单 。请参见下面的演示:

从结果中我们可以看到,每秒钟只能执行三个:

三 。分布式电流限制RateLimiter是单机限流元件 。如果是分布式应用该怎么办?
可以用Redis+lua实现,一般lua脚本代码如下:

Java代码如下:

解释:
Java代码将键和最大限制参数传入lua脚本 。
执行lua脚本(lua脚本判断当前键是否超过最大限制)
如果是,信息资源网返回0(当前限制)
如果不是,返回1(程序继续执行)
长期以来,在不同种类的软件开发人才的需求中,对Java工程师的需求总是很高,Java工程师的薪资水平也相对较高,所以每年学习Java的人越来越多 。但是因为每个人的基础和资历不同,学习的结果也有很大的差异,所以大家可以私信我【java】来我的讨论组互相交流,获取Java学习资料!


    推荐阅读