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

/ 0评 / 0

限流是什么意思(限流基本知识介绍)

之前在学习的时候也接触不到高并发/大流量这种东西,所以限流当然是没接触过的了。在看公司项目标时候,发明有用到限流(RateLimiter),顺带懂得一波。

一、限流基本知识介绍

为啥要限流,信任就不用我多说了。

在代码世界上,限流有两种比拟常见的算法:

1.1 什么是漏桶算法

比如,现在我有一个桶子,绿色那块是我能装水的容量,如果超过我能装下的容量,再往桶子里边倒水,就会溢出来(限流):

我们目前可以知道的是:

OK,现在我们在桶子里挖个洞,让水可以从洞子里边流出来:

桶子的洞口的大小是固定的,所以水从洞口流出来的速率也是固定的。

所以总结下来算法所需的参数就两个:

漏桶算法有两种实现:

  1. 不许可突发流量的情形:如果进水的速率大于出水的速率,直接舍弃掉过剩的水。比如,我的桶子容量能装100L,但我的桶子出水速率是10L/s。此时,如果现在有100L/s的水进来,我只让10L的水进到桶子,其余的都限流。(限定了要求的速度)

  2. 许可必定的突发流量情形:我的桶子能装100L,如果现在我的桶子是空的,那么这100L的水都能进我的桶子。我以10L/s的速率将这些水流出,如果还有100L的水进来,只能限流了。

经过上面的剖析我们就知道:

漏桶算法可以平滑网络上的突发流量(因为漏水的速率是固定的)

1.2 什么是令牌桶算法

现在我有另外一个桶子,这个桶子不用来装水,用来装令牌:

令牌会必定的速率扔进桶子里边,比如我1秒扔10个令牌进桶子:

桶子能装令牌的个数有上限的,比如我的桶子最多只能装1000个令牌。

每个要求进来,就会去桶子拿一个令牌

令牌桶算法支撑网络上的突发流量

**漏桶和令牌桶的差别:**从上面的例子估量大家也能看出来了,漏桶只能以固定的速率去处置要求,而令牌桶可以以桶子最大的令牌数去处置要求

二、RateLimiter应用

RateLimiter是Guava的一个限流组件,我这边的体系就有用到这个限流组件,应用起来十分便利。

引入pom依附:

RateLimiter它是基于令牌百思特网桶算法的,API非常简略,看以下的Demo:

我们可以从成果看出,每秒只能履行三个:

三、散布式限流

RateLimiter是一个单机的限流组件,如果是散布式运用的话,该怎么做?

可以应用Redis+Lua的方法来实现,大致的lua脚本代码如下:

Java代码如下:

说明:

一直以来,在不同类别软件开发人才的需求中,对于Java工程师的需求量一直居高不下,而且Java工程师的薪资程度相对较高,所以每年学习Java的人也越来越多。但(原创www.isoyu.com版权)由于每个人的基本、资质有所不同,学习结果也就大不雷同,所以大家可以私信我【java】进我的讨论组一起交换,获取Java学习资料!