计数器算法
计数器算法: 指定时间内,累计访问次数,达到设定的阈值时,触发限流策略,下个时间周期进行访问试,统计访问数清零。可以利用redis的incr 原子自增性,再结合过期时间实现
计时器算法无法解决临界问题,相邻周期之间时间段出现大并发,如第一个周期最后10秒和第二个周期前十秒,出现超过100限流阈值。
滑动时间窗口算法
为了解决计算器算法的临界值问题,发明了滑动窗口算法,在TCP网络通信协议中,就是采用这种算法解决网络拥堵问题
滑动时间窗口就是将计算器中的实际周期切分为多个小的时间窗口,分表在每个时间窗口中记录访问次数,然后根据时间将窗口往前移动,并删除过期的时间窗口,最终只需要统计滑动范围内小时间窗口的总的访问数
漏桶限流算法
漏桶算法的原理:我们维持一个漏斗,它有恒定的流出速度,不管水流流入的速度有多快,漏斗出水的速度保持不变,类似消息中间件,不管消息生产者请求量多大,消息处理能力取决于消费者
漏桶容量 = 漏桶的流出速度 * 可接受等待时长。容量范围内的请求可以排队等待处理,超过这个容量的请求才会被抛弃
漏桶限流算法存在下面情况
1.请求请求速度大于漏桶流出速度,也就是请求量大于服务能处理的最大极限值,触发限流策略
2,请求速度小于或等于漏桶的流出速度,也就是服务处理能力等于或是大于请求量,正常执行
缺点:当系统在短期突发大流量,漏桶算法无法处理
令牌桶算法
令牌桶,在一个桶容器中,装有一定数量的令牌,系统恒定速率投递令牌到桶中。客户端连接后需要拿到一个令牌才能有访问系统的资格。令牌桶满的时候,系统投递的新令牌将被抛弃,不能放入桶内
令牌桶算法存在下面情况
1.请求速度快于令牌生成速度,当桶内令牌被拿完,就会限流
2.请求速度等于令牌生成速度,系统处于平稳,也就是最近的并发状态
3.请求速度小于令牌生成速度,系统处理能力高于请求数量,系统正常
优点:由于有一个桶的存在,能处理短时间大量流量的场景