流控的使用场景
- 保护系统稳定性: 流控算法可以限制系统的请求流量,防止突发的大流量请求导致系统资源耗尽,从而保护系统的稳定性,避免系统崩溃或性能下降。
- 避免资源竞争: 在高并发的情况下,如果不进行流控,多个请求可能会竞争有限的资源(如数据库连接、线程池等),导致资源竞争和资源耗尽,进而影响系统的响应时间和可用性。
- 防止恶意攻击: 流控算法可以限制来自单个IP地址或用户的过多请求,防止恶意攻击和滥用系统资源,提高系统的安全性。
- 提高服务质量: 通过合理的流控策略,可以确保系统能够正常处理合理范围内的请求,从而提高服务的质量和稳定性,减少服务的不可用或延迟现象。
固定窗口算法
设计原理
维护一个单位时间内的计数值,每当一个请求通过时,就将计数值加1,当计数值超过预先设定的阈值时,就拒绝单位时间内的其他请求
问题
假设我们设定1秒内允许通过的请求阈值是99,如果有用户在时间窗口的最后几毫秒发送了99个请求,紧接着又在下一个时间窗口开始时发送了99个请求,那么这个用户其实在一秒内成功请求了198次,显然超过了阈值但并不会被限流(会有突刺问题)
滑动窗口算法
设计原理
假设我们设定1秒内允许通过的请求是200个,但是在这里我们需要把1秒的时间分成多格,假设分成5格(格数越多,流量过渡越平滑),每格窗口的时间大小是200毫秒,每过200毫秒,就将窗口向前移动一格
问题
流量的过渡是否平滑依赖于我们设置的窗口格数也就是统计时间间隔,格数越多,统计越精确,但是具体要分多少呢?
小总结: 固定窗口 和 滑动窗口 解决:单位时间总流量
漏斗算法
设计原理
漏斗算法以一个常量限制了出口流量速率,因此漏斗算法可以应对平滑突发的流量。其中漏斗作为流量容器我们可以看做一个FIFO的队列,当入口流量速率大于出口流量速率时,因为流量容器是有限的,当超出流量容器大小时,超出的流量会被丢弃