文章目录
固定窗口计数(Fixed Window Counting)
原理
固定窗口计数算法将时间划分为固定长度的时间窗口(如每秒、每分钟),在每个窗口内统计请求的数量。当请求数超过预设的阈值时,后续的请求将被限流或拒绝。
优点
实现简单,计算开销小。
适用于请求量波动不大的场景。
缺点
存在“突发效应”:在窗口边界时,可能会瞬间涌入大量请求,导致短时间内的高并发。
应用场景
适用于对流量有大致控制需求,但对瞬时流量波动不敏感的场景。
滑动窗口计数(Sliding Window Counting)
原理
滑动窗口计数算法将固定窗口进一步细分为多个子窗口,并在每个请求到达时计算当前滑动窗口内的请求总数。这样可以更精确地控制流量,减少突发效应。
优点
相比固定窗口,更加平滑和精确地控制流量。
减少窗口边界的突发效应。
缺点
实现相对复杂,计算开销较大。
应用场景
适用于需要精确控制流量且流量波动较大的场景。
令牌桶算法(Token Bucket)
原理
令牌桶算法以固定的速率生成令牌,存放在桶中。每当一个请求到达时,需要从桶中取出一个令牌才能被允许通过。如果桶中没有令牌,按照配置的策略(如排队等待或直接拒绝)处理请求。
优点
能够处理瞬时的流量高峰,具有较好的弹性。
支持突发流量,在一定程度上提高系统的容错能力。
缺点
需要维护令牌桶的状态,增加实现复杂度。
应用场景
适用于需要支持短时间内流量突增,同时保持整体流量控制的场景。
漏桶算法(Leaky Bucket)
原理
漏桶算法将请求视为水滴流入一个漏桶,桶以固定的速率漏出。无论请求流入的速度如何,漏桶都会以固定速率处理请求。当桶满时,多余的请求将被丢弃或处理。
优点
流量输出均匀,适合需要平滑处理请求的场景。
能有效防止请求突发导致的系统过载。
缺点
对突发流量的处理不如令牌桶灵活。
应用场景
适用于对请求处理速率有严格要求,且不需要支持突发流量的场景。
线程数限制(Thread Count Limiting)
原理
除了基于请求速率的限流,Sentinel 还支持基于并发线程数的限流。通过限制同时处理请求的线程数,避免系统因并发过高而导致资源耗尽。
优点
直接控制系统并发度,防止资源竞争和系统崩溃。
简单易实现,与系统的并发模型紧密结合。
缺点
需要对系统的线程模型有深入理解,配置不当可能影响系统吞吐量。
应用场景
适用于对系统并发度有严格要求的场景,如数据库连接数限制、第三方接口调用限制等。
动态限流(Dynamic Flow Control)
原理
Sentinel 支持基于实时监控数据动态调整限流规则。例如,根据系统负载、响应时间等指标自动调整限流阈值,以实现更智能的流量控制。
优点
具备自适应能力,能动态应对不同的流量和系统状态。
提高系统的弹性和稳定性。
缺点
实现复杂,需要持续监控和调整策略。
可能存在调整延迟,无法瞬时应对突发情况。
应用场景
适用于流量波动较大且系统负载变化频繁的复杂场景,如大型电商平台、高并发API服务等。