常见的限流算法
计数器限流算法( 固定窗口限流算法)
内部维护一个计数器,单位时间作为一个窗口,假设系统每秒允许1W个请求,当0.5秒的时候请求量已经达到1W,那么后面0.5秒的请求就会被拒绝。
优点:实现简单、性能好。
缺点:无法处理窗口切换瞬间流量突然翻倍的情况。
滑动窗口限流算法
相对与固定窗口,滑动窗口还需要记录窗口内每个请求的到达时间点,假设系统每秒允许1W个请求,当新请求到达时,根据当前时间往前推1秒计算请求量是否达到1W,如果达到请求就会被拒绝。
优点:可以更加精准控制窗口内的流量,使流量控制更加的平滑,不会出现流量突然翻倍的情况。
缺点:需要记录窗口内的每个请求信息,可能会消耗更多的内存资源。
漏桶限流算法
桶大小固定,以固定的速率流出水,不限制流入水的速度,当水溢出时后续请求会被拒绝。有点类似消息队列的削峰填谷思想。
优点:让数据已恒定速度处理,适用于需要限制处理速率的场景(适合削峰)。
缺点:如果流量较大,请求需要排队时间较长,导致消息大量积压,如果请求超出桶容量还会被拒绝。
令牌桶限流算法
桶大小固定,以固定的速率往桶里放入令牌,如果令牌超出桶的容量就丢弃,请求进入时,需要先获取一个令牌,拿到令牌则执行业务逻辑,拿不到令牌则被拒绝。
优点:如果桶中有足够的令牌可以应对一定的流量突发,反之令牌数较小,处理延迟会很低。
缺点:无法精准限制每秒请求数。例如:限流频率每秒10次请求,0-1s一直没有请求,1.1s是突然有10个请求,会被执行,之后1-2s还是可以继续处理10个请求。