java并发和高并发之应用限流

一、限流,通俗说即限制请求访问的数量,防止某个时间点,或者短时间内,有大量的请求访问后台服务器或者数据库。比如常见

的电商情景下的抢购、秒杀活动。

java并发和高并发之应用限流

 如上图所示,直接的方案,就是不做任何限流处理时的情况,下方恒定速率指的即是经过限流后的效果。

二、常见的限流方案有:

限制总的并发数:

限制瞬时并发数:

限制时间窗口内的平均速率:

三、常见的限流算法:

计数器法:最简单、最易实现的算法。假设1分钟内,限制请求数量在某个值比如100,则每次有一个请求进入,则计数变量加1,如果一分钟内达到了100个请求,则计数器变量重置为初始值为0。但是有个致命的问题,就是临界问题。假设,在临近一分钟的时候,比如59秒,突然涌入了100个请求,此时,在不到两分钟的时间里,涌入了200个请求,此时很容易超过限定值,所以存在问题。

java并发和高并发之应用限流

滑动窗口算法:实际上和计数器算法一致,只是该算法是把计数器算法中的时间间隔缩小,间隔越精细,精确度越高,出现问题

的概率越小。但也意味着会消耗更多的存储空间,因为每个间隔区间都需要维护一个计数器变量。

如下图,在原来的计数器算法的基础上,将一分钟的时间间隔缩小到更小,比如一分钟分为6个10s

java并发和高并发之应用限流

漏桶算法:不能控制流入的数量(即无法控制请求进入的速度),但是可以保证恒定的输出(比如无法控制请求到服务器的数

量,但是可以控制请求到达数据库的速度为恒定)。该算法天生保证输出速率恒定,无临界问题。

java并发和高并发之应用限流

令牌桶算法:和漏桶算法差不多。该算法原理为,初始状态,桶里是没有令牌(token)的,当请求过来时,如果没有令牌,则请

求无法进行到下一步。只有桶里有令牌,才能从桶里拿出令牌放到下方,允许程序继续进行。

java并发和高并发之应用限流

总结:

计数器算法可以看做是滑动窗口算法 的一种粗粒度实现,滑动窗口算法占用的存储空间相对较大,但精度越大,结果越准确,

令牌桶算法和漏桶算法相比,令牌桶算法允许突发事件的发生, 而且因为令牌从桶内移出时基本不消耗时间,被用的较多。