引言
本篇内容根据《spring cloud alibaba 微服务原理与实战》中内容摘取,希望和大家分享限流的思想,本篇不涉及代码层面的实现。
限流的目的
目的
:通过限制并发访问数或者限制一个时间窗口内允许处理的请求数量来保护系统作用
:损失一部分用户的可用性,为大部分用户提供未定可靠的服务
一旦达到限制数量则对当前请求处理采取对应的拒绝策略(这里其实和Java中的executor线程池原理是一样的),比如跳转到错误页面、拒接请求、进入排队系统、降级等。
限流的四种算法
1、计数器算法
计数器算法是一种比较简单的限流实现算法,在指定周期内累加访问次数,当访问次数达到设定的阙值时,触发限流策略,当进入下一个时间周期时进行访问次数的清零
流程图如下:
这是正常的情况下,根据计数器算法,进行整个流程的控制
临界问题:
2、滑动窗口算法(sentinel使用)
为了解决计数器算法带来的临界问题,所以引入额滑动窗口算法
TCP网络通信协议中,就采用了滑动窗口算法来解决网络拥塞的情况
原理:在固定窗口中分割出来多个小时间窗口,分别在每个小时间窗口中记录访问次数,然后根据时间将窗口往前滑动并删除过期的小时间窗口。最终只需要统计滑动窗口范围内的所有小时间窗口总的技术即可
流程图如下:
3、令牌桶限流算法
令牌桶
:是网络流量整形(traffic shaping)和速率限制(Rate Limiting)中最常用的一种算法。对于每个请求,都需要从令牌桶中获得一个令牌,如果没有获得令牌,则需要触发限流策略。
流程图如下:
系统会以一个恒定速度(r tokens/sec)往固定容量的令牌桶中放入令牌,如果此时有客户端请求过来,需要先从令牌桶中拿到令牌以获得访问资格。
令牌桶算法机制:
假设令牌生成速度是每秒10个,也就等同于QPS=10,此时在请求获取令牌的时候,会存在三种情况:
- 请求速度 > 令牌生成速度:那么令牌会很快被取完,后续再进来的请求会被限流
- 请求速度 = 令牌生成速度:此时流量处于平稳状态
- 请求速度 < 令牌生成速度:说明此时系统的并发数并不高,请求能被正常处理
由于令牌桶有固定大小,当请求速度小于令牌生成速度时,令牌桶会被填满
所以令牌桶能够处理突发流量,也就是在短时间内新增的流量系统能够正常处理
4、漏桶限流算法
漏桶限流算法:主要作用是控制数据注入网络的速度,平滑网络上的突发流量
流程图如下:
漏桶限流算法机制:
- 请求速度 > 漏桶流出水滴的速度:也就是请求数超出当前服务所能处理的极限,将会触发限流策略
- 请求速度 <= 漏桶谁出水滴的速度:也就是服务端处理能力正好满足客户端的请求量,将正常执行
漏桶限流算法和令牌桶限流算法的实现原理相差不大
唯一区别:漏桶无法处理短时间内的突发流量,漏桶限流算法是一种恒定速度的限流算法