一:限流的作用
有高并发的系统中,由于API接口无法控制调用发的行为,因此如果遇到瞬时请求数量递增,就会导致接口占用过多的服务器子u,导致响应速度降低或者超时,甚至可能英雌导致服务器宕机,尤其是数据库服务器。
所以就有限流的思想,限制客户端对服务器端端的请求限制,如果在单位时间内超过该请求限制,就会执行快速失败或者服务降级。
所以限流主要应对一下情况:
-
热点业务带来的突发情况
-
调用方bug导致的突发请求
-
恶意攻击请求
二:主要的限流算法
核心思想:限制每秒的事务数 -
固定窗口计数器
核心思路:
1:将时间化为多个窗口
2:在每个窗口内请求一次计数器加一
3:如果计数器超过限制数量,则本窗口所有请求都丢弃到下一个时间窗口,计数器重置。
缺陷:如果在在该窗口内前半段时间没有请求,后半段时间请求饱和,这也会导致请求激增。 -
滑动窗口计数器
核心思路:
思路大致和固定窗口计数器一致,只不过是在将时间划为多个区间,每经过一个区间的时间,则抛弃最老的一个区间,并纳入新的区间。
这就可以避免双倍请求的出现,不过时间区间的精度越高,所需要的空间容量越大 -
漏桶算法
核心思路:
1:将每个请求视为水滴放入漏桶进行存储
2:漏桶已固定速率向外漏出请求,如果漏桶空了则停止漏水
3:如果漏桶满了就会直接将水滴丢弃
具体实现就是是使用队列时间,从队列中取出请求,如果请求过多则放在队列外排队或者拒绝
缺陷:短时间有大量请求,需要等待一段时间才能响应 -
令牌桶算法
核心思路:
1:令牌以固定速率生成
2:生成的令牌放入令牌桶,如果桶满了令牌直接丢弃,请求只有从令牌桶值拿到令牌才可以执行
3:如果令牌桶空了,请求直接被丢弃
这样请可以将请求平均分布到时间区间内,又可以承受突发激增请求。是一种比较常用的限流算法