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

限流是什么意思(限流基础知识介绍)
之前学习的时候没有接触过高并发/高流量这种东西,所以当然没有接触过限流 。在查看公司的项目时,我发现使用RateLimiter很有用,顺便了解了一下 。
一、限流基础知识介绍关于你为什么要限制电流,我不需要多说什么 。
比如周末去餐厅吃饭,但是人太多,只能去前台取号,号码到了才能进餐厅吃饭 。如果酒店没有流量限制怎么办?饭一到,大家都冲进去,酒店又容不下这么多人,很容易出事(酒店人多,无路可走 。酒店工作人员崩溃了,无法处理)
回到代码世界,也是如此 。服务器可以处理的请求数量有限 。如果请求的数量非常大,我们需要限制电流(要么让请求等待,要么扔掉它们) 。
在代码世界中,有两种常见的电流限制算法:
令牌桶算法
漏桶
1.1什么是漏桶?
比如现在我有一个水桶,绿色的是我能装水的容量 。如果超过我能容纳的容量,将水倒入桶中,水就会溢出(限流):

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

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

代币以一定的速度被扔进桶里 。例如,我在一秒钟内向桶中扔出10个代币:

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

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

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

从结果中我们可以看出,每秒只能执行三次:

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

Java代码如下:

解释:
Java代码将密钥和最大限制参数传入lua脚本 。
执行lua脚本(lua脚本判断当前密钥是否超过最大限制)
如果超过,则返回0(电流限制)
如果没有,返回1(程序继续执行)
一直以来,在不同种类的软件开发人才的需求中,对Java工程师的需求总是很高,而Java工程师的薪资水平相对较高,所以每年学习Java的人越来越多 。但是因为每个人的基础和资质不同,学习的结果也有很大的不同,所以大家可以私信我【java】来我的讨论组互相交流,获取Java学习资料!
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人 。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任 。如发现本站有涉嫌抄袭侵权/违法违规的内容,请发送邮件至 2672143071@qq.com 举报,一经查实,本站将立刻删除 。

    推荐阅读