常见限流算法总结

固定窗口计数(Fixed Window Counting)

原理

固定窗口计数算法将时间划分为固定长度的时间窗口(如每秒、每分钟),在每个窗口内统计请求的数量。当请求数超过预设的阈值时,后续的请求将被限流或拒绝。

优点

实现简单,计算开销小。
适用于请求量波动不大的场景。

缺点

存在“突发效应”:在窗口边界时,可能会瞬间涌入大量请求,导致短时间内的高并发。

应用场景

适用于对流量有大致控制需求,但对瞬时流量波动不敏感的场景。

滑动窗口计数(Sliding Window Counting)

原理

滑动窗口计数算法将固定窗口进一步细分为多个子窗口,并在每个请求到达时计算当前滑动窗口内的请求总数。这样可以更精确地控制流量,减少突发效应。

优点

相比固定窗口,更加平滑和精确地控制流量。
减少窗口边界的突发效应。

缺点

实现相对复杂,计算开销较大。

应用场景

适用于需要精确控制流量且流量波动较大的场景。

令牌桶算法(Token Bucket)

原理

令牌桶算法以固定的速率生成令牌,存放在桶中。每当一个请求到达时,需要从桶中取出一个令牌才能被允许通过。如果桶中没有令牌,按照配置的策略(如排队等待或直接拒绝)处理请求。

优点

能够处理瞬时的流量高峰,具有较好的弹性。
支持突发流量,在一定程度上提高系统的容错能力。

缺点

需要维护令牌桶的状态,增加实现复杂度。

应用场景

适用于需要支持短时间内流量突增,同时保持整体流量控制的场景。

漏桶算法(Leaky Bucket)

原理

漏桶算法将请求视为水滴流入一个漏桶,桶以固定的速率漏出。无论请求流入的速度如何,漏桶都会以固定速率处理请求。当桶满时,多余的请求将被丢弃或处理。

优点

流量输出均匀,适合需要平滑处理请求的场景。
能有效防止请求突发导致的系统过载。

缺点

对突发流量的处理不如令牌桶灵活。

应用场景

适用于对请求处理速率有严格要求,且不需要支持突发流量的场景。

线程数限制(Thread Count Limiting)

原理

除了基于请求速率的限流,Sentinel 还支持基于并发线程数的限流。通过限制同时处理请求的线程数,避免系统因并发过高而导致资源耗尽。

优点

直接控制系统并发度,防止资源竞争和系统崩溃。
简单易实现,与系统的并发模型紧密结合。

缺点

需要对系统的线程模型有深入理解,配置不当可能影响系统吞吐量。

应用场景

适用于对系统并发度有严格要求的场景,如数据库连接数限制、第三方接口调用限制等。

动态限流(Dynamic Flow Control)

原理

Sentinel 支持基于实时监控数据动态调整限流规则。例如,根据系统负载、响应时间等指标自动调整限流阈值,以实现更智能的流量控制。

优点

具备自适应能力,能动态应对不同的流量和系统状态。
提高系统的弹性和稳定性。

缺点

实现复杂,需要持续监控和调整策略。
可能存在调整延迟,无法瞬时应对突发情况。

应用场景

适用于流量波动较大且系统负载变化频繁的复杂场景,如大型电商平台、高并发API服务等。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wending-Y

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值