流量控制的方法
白名单机制:
可以采用白名单的机制来限制访问,没有加入白名单的用户不让访问系统
令牌池机制也叫令牌桶
用户访问系统必须获得令牌池中的令牌,才能进行访问。令牌池每秒钟,阀门开启一次,所有的请求去令牌池中并发的抢夺令牌,获得令牌的可以访问系统,没有获得的返回“系统正忙”或者让该请求加入队列然后重试(注意:这里是一个坑,不能让请求加入到队列中,因为加入队列后会带来很大的问题,访问的请求底层是一个socket连接,我们不知道要过多长时间才能获得访问,hold住这个socket连接要耗费系统的资源,如果保存的请求量比较大的,系统的load会非常的高,会带来很大的系统负载压力。最好的方法是让直接拒绝掉访问的请求,返回给用户,让用户重试,重新访问)。
可以通过控制令牌池中令牌的数量来控制访问,当一个请求访问获得令牌时令牌池中的令牌数量减一,当访问结束后要把令牌还回到令牌池中,令牌数量加一。
- 限QPS
阀门每秒开启一次,开启后重新初始化令牌池根据初始化的令牌数量限制每秒能够进行的请求数量,取了令牌后不用归还。
- 限并发
限制同一时间的请求只能敷在多少。他的令牌池是固定的,直接限制并发,取令牌进行访问,访问结束后归还令牌。
简单的实现实例:java信号量实现方式
漏桶算法
每个接口限定一个固定的处理请求能力,相当于一个固定的桶能承载的最大的水的容量,而这个桶的大小就是最多能处理的请求并发数能力,然后每处理完一个请求,那么漏桶里面的水就会漏出去一些,如果请求来的时候,漏桶已达到承载极限(水装满了),这时就是请求速度大于处理速度并且堆积的请求太多了的情况。最终漏桶的水将会溢出,就相当于拒绝了请求。
漏斗有一个进水口 和 一个出水口,出水口以一定速率出水,并且有一个最大出水速率:
在漏斗中没有水的时候,
- 如果进水速率小于等于最大出水速率,那么,出水速率等于进水速率,此时,不会积水
- 如果进水速率大于最大出水速率,那么,漏斗以最大速率出水,此时,多余的水会积在漏斗中
在漏斗中有水的时候
- 出水口以最大速率出水
- 如果漏斗未满,且有进水的话,那么这些水会积在漏斗中
- 如果漏斗已满,且有进水的话,那么这些水会溢出到漏斗之外
漏桶与令牌桶的比较
漏桶的出水速度是恒定的,那么意味着如果瞬时大流量的话,将有大部分请求被丢弃掉(也就是所谓的溢出)。
令牌桶来说,
生成令牌的速度是恒定的,而请求去拿令牌是没有速度限制的。这意味,面对瞬时大流量,该算法可以在短时间内请求拿到大量令牌,而且拿令牌的过程并不是消耗很大的事情。
文档索引
【流量控制系列1】引言和索引
【流量控制系列2】流量控制的基础方法和算法
【流量控制系列3】Semaphore信号量介绍
【流量控制系列4】Sentinel和Hystrix对比
【流量控制系列5】Sentinel 详细介绍
【流量控制系列6】Sentinel 详细介绍-SlotChain源码解析
【流量控制系列7】Sentinel实践