计数器算法
计数器算法是一种比较简单的限流实现算法,在制定周期内累加访问次数,当访问次数达设定的阈值触发限流策略,当进入下一个时间周期时进行访问次数的清零。
存在的临界问题
滑动窗口
滑动窗口是一种流量控制技术,在TCP网络通信协议中,就采用了滑动窗口算法来解决网络堵塞的问题。
滑动窗口算法的原理是在固定窗口中分割多个小的时间窗口,分别在每个小时间窗口中记录访问次数,然后根据时间将窗口往前滑动并删除过期的小时间窗口,最终只统计滑动窗口范围内的所有小时间窗口总的记数即可。
我们将一分钟拆分为4个小时间窗口,每个小时间窗口最多只能处理25个请求,并且通过虚线框表示滑动窗口的大小,当前窗口的大小是2,表示这个窗口内最多能处理50个请求,同时滑动窗口会随着时间往前移动,比如前面15结束后,窗口滑动到15~45s范围内,然后在新的窗口重新统计数据。
假定1s是一个窗口,那么1min就可以划分为60个窗口,所谓滑动窗口即系统只从当前有效窗口中获取信息,但有效窗口不是固定不变的,而是随着时间的推进不断向前“滑动”。
如果将一个窗口期设置为一分钟,那么第一秒所对应的窗口是有效窗口,时间到达第二秒时,第一个窗口和第二个窗口都是有效窗口,以此类推,直到整个窗口期长度达到一分钟。然后,每过一秒钟,当前窗口期内最左侧的窗口将不再生效,
令牌桶算法
令牌桶是网络流量整形(trafuc Shaping)和速率限制(rate limiting)中最常见的一种算法,对于每一个请求,都需要从令牌桶中获得一个令牌,如果没有获得令牌,则需要触发限流策略
漏桶限流算法
漏桶限流算法的主要作用是控制数据注入网络的速率,平滑网络的突发流量
消息中间件就是使用了漏桶限流得思路,不管生产者的请求量多大,消息的处理能力取决于消费者