限流概念:什么是限流呢?限流是限制到达系统的并发请求数量,保证系统能够正常响应部分用户请求,而对于超过限制的流量,则通过拒绝服务的方式保证整体系统的可用性。
限流的分类:
根据作用范围可以分为单机限流和分布式限流
根据限流方式可以分为计数器,滑动窗口,漏桶,令牌桶
限流方式:
一.计数器
原理:在一段时间内通过计数的方式对请求数进行统计,当count超过某个阈值的时候判断是否需要进行限流,到达时间临界点时count清零
简单来说就是超过了某个阈值就限流,断绝之后的请求,但是是在某段时间内
例如:假设阈值为两百,时间周期为1分钟,接受到请求一次则count+1
1. 比较当前请求和第一次请求(单位周期开始时的第一次请求)是否在1分钟内,再进行阈值比较,如果再1分钟内到达两百个请求,就进行限流
2.1分钟内没有达到两百请求,则在1分钟时count进行清零
这种方法虽然简单,但是存在一个很大的问题,就是再时间临界点的清零问题,以上述为例
如果再59的时候用户发送了199个请求,然后count清零,但是在下一个周期开始时第一秒又发送了199个请求,那么此时并不显示其达到阈值,但是实际已经超过阈值,这样就容易承接某些用户不必要的请求,甚至导致击穿系统?
二.滑动窗口
原理:基本原理和计数器是类似的,但是滑动窗口是将一个周期分为n个格子,然后周期不断往后移动,统计这n个格子的请求数再跟阈值进行比较。
比如将1分钟分为六个格子,当时间从0到一分钟时,时间临界点会往后移动一个格子,也就是十秒钟,这时候时间就从0-60s,变成了10-70s,统计的请求数也发生变化,可以处理刚刚计数器所说的缺点,但是这个算法的精度又由分的格子决定,而格子数又无法确定,因此也无法根本解决这个问题。
三.漏桶

原理图如上
一个固定容量的桶,有水流进来,也有水流出去。对于流进来的水来说,我们无法预计一共有多少水会流进来,也无法预计水流的速度。但是对于流出去的水来说,这个桶可以固定水流出的速率(处理速度),从而达到流量整形和流量控制的效果。
漏桶算法有以下特点:
漏桶具有固定容量,出水速率是固定常量(流出请求)
如果桶是空的,则不需流出水滴
可以以任意速率流入水滴到漏桶(流入请求)
如果流入水滴超出了桶的容量,则流入的水滴溢出(新请求被拒绝)
emmm。。。这篇博客原本属于稀土掘金的一个引流文,我看着写着不错就顺手拿来了,所以属于是转载吧,这边限流好像还有两点没有说到,以后有空补充吧