一 前文
提供服务暴露的接口,在流量低的情况或许并不需要考虑限流,因为在数据库或缓存的允许下就能正常的工作,但是当调用突然飙升的时候,那么就会出现异常情况,比如数据库的连接池和线程池就是一种限流手段,通过限制只有指定数量的工作线程,其他线程进行队列等待或是进行抛弃。
二 分布式中主要使用的技术
目前和dubbo一起运用较多的为Alibaba Sentinel,而SpringCloud中主要是运用了Hystrix(并发线程模式)。
三 限流实现
限流实现主要有1、计数器算法,2、滑动窗口算法,3、令牌桶算法,4、漏桶限流算法。令牌桶和漏桶
3.1 计数器算法
计算器算法,最简单的一种算法,原理就是在指定周期内只能执行n个请求,超过n的请求直接限流。假设周期为1分钟,最多执行100个请求。1-60s 最多100个请求,同时60-120s也最多100个请求,但是在30s和60s期间执行着50个请求,60s-90s期间执行着51个请求,这时候计数器是根据每分钟进行重置为0,那么他并未达到限流的条件,因为在60s的时候他已经重置为0了,但实际上调用的却是101个请求,导致限流局部失效。
3.2 滑动窗口算法
为了解决计数器算法的局部未生效临界问题,引入了滑动窗口算法。以下图位列,将一个周期内分为4块,每次只能执行4个窗口数量的请求,每次往前移动一块,可以重新统计当前