服务限流算法有哪些
计数器法(固定窗口):原理就是限制每秒处理请求数不超过阈值。比如一个接口一分钟可以处理1000次请求,那么可以设置一个计数器,当有一次请求过来,计数器就加1,如果一分钟以内计数器超过了1000,那么后面再过来的请求就不再处理;但是这个方法的缺点也很明显,因为请求的访问不一定是很平稳的,如果0:59过来了1000个请求,1:01已经是下一个窗口,又过来了1000个请求,但实际上三秒内来了2000个请求,已经超过我们的限流上限了;
滑动窗口:还拿上面的例子,一分钟分6份,每份10秒;每过10秒钟,我们的时间窗口就会往右滑动一格,每个格子都有独立的计数器,我们每次都计算时间窗口内的数量,可以解决计数器法中的问题,而且当滑动窗口的格子越多,那么限流的统计就会越精确。具体可以参考下图,看图比较清晰:
漏桶算法:这个算法也很简单,就是我们有一个固定容量的桶,有水流进来,也有水流出去,我们不需要控制流进来的速度,只需要控制流出去的速度,如果水流进来得太快,桶满了,多余的水会溢出区,并不会影响水流出去的速度。
令牌桶算法:还是有一个桶,桶里面有N个令牌,所有的请求在处理之前都需要拿到一个可用的令牌才会被处理,如果桶里面没有令牌的话,则拒绝服务;令牌桶算法的原理是系统会以一个恒定的速度往桶里放入令牌。
各个算法比较