sentinel限流算法
限流算法:固定窗口算法、滑动时间窗口、令牌桶和漏桶这四种常见限流算法的原理:
限流算法原理
-
固定窗口:
- 固定窗口算法将时间划分为固定大小的窗口,并在每个窗口内限制请求的数量。在每个窗口开始时,计数器重置,如果在当前窗口内请求数超过限制,则拒绝新的请求。
- 优点:简单易实现。
- 缺点:但对于时间精度要求较高的场景可能不够精确。
-
滑动时间窗口:
- 在固定窗口的基础上,滑动窗口计数器算法会将一个窗口划分为n个更小的区间:(在窗口的基础上引入区间的概念)
- 优点:实现简单,易于理解。比固定窗口更加精准。
- 缺点:无法保证整体流量曲线的平滑。
-
令牌桶:
- 有一个固定大小的桶,桶中会按照一定的速率生成令牌。
- 每个请求都需要消耗一个令牌才能通过,如果桶中没有足够的令牌,则请求会被拒绝。可以设置桶中令牌的上限来限制超时令牌累加问题。
- 优点:可以应对流量的突增,实现灵活的限流策略。
- 缺点:实现相对复杂,需要维护令牌的生成和消耗。
-
漏桶:
- 有一个固定大小的桶,请求可以进入桶中,然后按照固定的速率被处理。
- 漏桶可以保证流量的平滑输出,因为所有请求都会按照固定速率被处理,无论请求的到达速率如何。
- 优点:保证流量的平滑输出,实现严格的限流。
- 缺点:无法应对流量的突增,可能会导致请求的延迟。
总结
对比项 | 固定窗口算法 | 滑动时间窗口 | 令牌桶 | 漏桶 |
---|---|---|---|---|
能否保证流量曲线平滑 | 不能,存在临界点问题,可能导致流量突增 | 能,窗口内区间越小,流量控制越平滑 | 基本能,在请求量持续高于令牌生成速度时,流量平滑 | 能,所有请求进入桶内,以恒定速率放行,绝对平滑 |
能否应对突增流量 | 不能,突增流量只要高出限流阈值都会被拒绝 | 不能,徒增流量,只要高出限流阈值都会被拒绝 | 能,桶内积累的令牌可以应对突增流量 | 能,请求可以暂存在桶内 |
流量控制精确度 | 低,窗口区间越大,精度越低 | 低,窗口区间越小,精度越高 | 高 | 高 |
适用场景 | 适用于对时间精度要求不高的简单API限流 | 适用于大多数场景 | 适用于需要灵活限流策略的场景 | 适用于需要严格平滑流量输出的场景 |
这个表格总结了限流算法在保证流量曲线平滑、应对突增流量和流量控制精确度方面的特点,以及它们各自的适用场景。每种算法都有其优势和局限性,选择哪种算法取决于具体的业务需求和场景。
Sentinel 与 Gateway 限流算法区别
-
Gateway:
- 主要采用基于 Redis 实现的令牌桶算法。
- 令牌桶算法能够应对流量的突增,因为它允许在短时间内消耗桶中积累的令牌。
-
Sentinel:
- 提供了更复杂的限流策略,包括:
- 默认限流模式:基于滑动时间窗口算法,适用于大多数场景,可以保证在窗口内流量的平滑,但无法保证整体流量曲线的平滑。
- 排队等待的限流模式:基于漏桶算法,可以保证流量以固定速率被处理,适用于需要严格平滑流量输出的场景。
- 热点参数限流:基于令牌桶算法,适用于对特定热点参数进行限流的场景,可以应对突增流量。
- 提供了更复杂的限流策略,包括: