文章目录
- 4.限流算法
- 4.1计算器
- 4.2漏桶算法
- 4.3令牌桶限流
4.限流算法
4.1计算器
- 计数器比较简单粗暴,比如我们要限制1s能够通过的请求数
- 实现的思路就是从第一个请求进来开始计时,在接下来的1s内,每个请求进来请求数就+1,超过最大请求数的请求会被拒绝,等到1s结束后计数清零,重新开始计数。
这种方式有个很大的弊端:比如前10ms已经通过了最大的请求数,那么后面的990ms的请求只能拒绝,这种现象叫做“突刺现象”。
4.2漏桶算法
-
原理:
-
桶底出水的速度恒定,进水的速度可能快慢不一
-
但是当进水量大于出水量的时候,水会被装在桶里,不会直接被丢弃;但是桶也是有容量限制的,当桶装满水后溢出的部分还是会被丢弃的。
-
-
核心思想: 接收指定数量的请求,按照指定的速率处理。
-
算法实现:
- 可以准备一个队列来保存暂时处理不了的请求,然后通过一个线程池定期从队列中获取请求来执行。
-
缺点:并发性差,需要对每个水滴(请求)逐个进行处理
4.3令牌桶限流
-
核心思想:
- 令牌桶就是生产访问令牌的一个地方,生产的速度恒定
- 用户访问的时候当桶中有令牌时就可以访问,否则将触发限流。
-
算法步骤:
- 每隔一段时间生成一定数量的令牌放入桶中;
- 当有请求到达时,从桶中获取一个令牌,如果没有令牌可用,则拒绝该请求。
-
实现方案:Guava RateLimiter限流
Guava RateLimiter是一个谷歌提供的限流,其基于令牌桶算法,比较适用于单实例的系统。
-
优点:令牌桶限流的并发性能比较高,我们可以批量对拿到令牌的请求进行处理。