Appearance
阿里的Sentinel底层是如何实现限流的?超过限流数的请求如何处理?直接丢弃吗?
一、Sentinel的底层限流实现机制
1. 限流的核心思想
Sentinel主要采用滑动时间窗口结合计数器的原理进行流量统计和限流判断,也融合了令牌桶、漏桶等思想。核心目标是在单位时间内只能通过限定的请求数,超出则触发限流。
2. 滑动窗口结构
- 时间窗口划分:Sentinel将统计时间(如1秒)切成多个格子(如每格100ms),每个格子记录当前格子的请求数。
- 窗口滑动:每次有请求进来,根据时间戳判断属于哪个格子,并刷新对应计数。多个格子的统计值累加得出单位时间的总请求数。
- 核心数据结构:底层常用LeapArray这类循环队列管理时间窗口,保障统计高并发下的效率和准确度。
3. 阈值判断
每当有新请求进来时:
- Sentinel会计算当前时间窗口累计的请求数。
- 若超过限流阈值,则进入限流逻辑。
二、超过限流数的请求如何处理?直接丢弃吗?
Sentinel提供了多种限流处理策略,通过配置FlowRule的controlBehavior参数决定。
1. 常用处理方式
| controlBehavior | 处理方式 | 说明 |
|---|---|---|
| 0(默认) | 直接拒绝 | 超过阈值的请求立即被拒绝,直接返回异常 |
| 1 | 匀速排队(漏桶) | 超过阈值的请求以固定速率排队等待 |
| 2 | 预热 | 刚启动时先低速允许,通过预热逐步上升 |
默认行为:直接拒绝
若未特殊配置,Sentinel是**直接丢弃(快速失败)**超过阈值的请求,并返回“限流”异常(如BlockException),这样下游系统不会因为过量流量被压垮。
匀速排队模式(漏桶思想)
若选择该模式,超过阈值的请求会被短时间排队处理,超时再丢弃。
预热模式
常用于服务刚启动的流量缓升场景,避免冷启动雪崩。
三、如何配置与适用场景
- 通过流控规则(FlowRule)灵活选择对应策略,如:
- 高频接口建议用直接拒绝(0),以免耗尽资源。
- 部分容忍等待的请求可用匀速排队(1)。
- 所有策略都能通过Sentinel Dashboard动态配置和变更。
总结
- Sentinel底层主要采用滑动窗口+计数器限流,部分场景引入令牌桶/漏桶思想。
- 超过限流数的请求默认会被直接拒绝(丢弃);可配置为排队或预热模式。
- 具体选择哪种处理方式,要根据业务容忍度和实际需求配置。
更新: 2025-05-05 19:31:51
原文: https://www.yuque.com/tulingzhouyu/db22bv/kfaxscfgk5uasyg0