Sentinel 熔断降级:保护服务链路的稳定性机制
熔断降级是 Sentinel 保障服务稳定性的另一核心能力,当调用链路中某个资源因异常(如响应缓慢、错误率高)变得不稳定时,Sentinel 会暂时 “熔断” 对该资源的调用,避免故障扩散至整个链路。与流量控制不同,降级更关注资源自身的状态健康度,通过 “故障隔离” 实现系统的弹性容错。
熔断降级的核心目标
在分布式系统中,服务间依赖关系复杂,一个资源的故障可能引发 “雪崩效应”(如 A 依赖 B,B 依赖 C,C 故障导致 B 超时,进而导致 A 崩溃)。熔断降级的目标是:
- 当资源异常时,快速 “切断” 调用,避免无效等待或错误累积;
- 给故障资源 “恢复时间”,熔断一段时间后尝试恢复调用;
- 保护调用方资源(如线程、连接)不被耗尽,确保系统整体可用。
熔断策略详解
Sentinel 提供三种熔断策略,覆盖不同的异常场景,可根据业务特点选择配置:
1. 慢调用比例(SLOW_REQUEST_RATIO)
核心逻辑:当资源的慢调用比例超过阈值时,触发熔断,避免因长期等待耗尽调用方资源。
关键参数(Dashboard 配置项):
- 最大 RT(毫秒):定义 “慢调用” 的阈值,响应时间超过该值的请求被视为 “慢调用”(默认值 4900ms,可通过 JVM 参数
-Dcsp.sentinel.statistic.max.rt
调整); - 比例阈值:慢调用占总请求的比例阈值(范围 [0.0,1.0],如 0.5 代表 50%);
- 最小请求数:单位统计时长内,触发熔断的最小请求数(避免少量请求导致误判,默认 5);
- 熔断时长(毫秒):熔断后,持续拒绝调用的时间(如 10000ms,即 10 秒);
- 统计时长:默认 1000ms(1 秒),即基于每秒的数据判断。
触发条件(需同时满足):
- 单位统计时长内,请求数 ≥ 最小请求数;
- 慢调用(响应时间>最大 RT)的比例 ≥ 比例阈值。
状态转换:
- 正常(CLOSED) → 满足条件 → 熔断(OPEN):熔断时长内,所有请求被拒绝;
- 熔断(OPEN)→ 熔断时长结束 →探测恢复(HALF-OPEN):允许一个请求尝试调用;
- 若该请求响应时间 ≤ 最大 RT → 正常(CLOSED)(熔断结束);
- 若该请求响应时间 > 最大 RT → 熔断(OPEN)(重新计时熔断时长)。
适用场景:
- 对响应时间敏感的接口(如支付、下单),避免因慢调用导致调用方线程阻塞;
- 依赖外部服务(如第三方 API)的接口,外部服务偶尔响应缓慢时使用。
2. 异常比例(ERROR_RATIO)
核心逻辑:当资源的异常请求比例超过阈值时,触发熔断,避免无效调用消耗资源。
关键参数:
- 异常比例阈值:异常请求占总请求的比例(范围 [0.0,1.0],如 0.3 代表 30%);
- 最小请求数:单位统计时长内,触发熔断的最小请求数(默认 5);
- 熔断时长(毫秒):熔断后拒绝调用的时间;
- 统计时长:默认 1000ms(1 秒)。
触发条件(需同时满足):
- 单位统计时长内,请求数 ≥ 最小请求数;
- 异常请求(如抛出异常、返回错误码)的比例 ≥ 异常比例阈值。
状态转换:
- 正常(CLOSED) → 满足条件 → 熔断(OPEN);
- 熔断(OPEN)→ 熔断时长结束 →探测恢复(HALF-OPEN):允许一个请求尝试调用;
- 若该请求无异常 → 正常(CLOSED);
- 若该请求有异常 → 熔断(OPEN)。
适用场景:
- 接口错误率波动较大的场景(如数据库偶发连接失败);
- 依赖不稳定服务的接口(如上游服务偶尔返回 500 错误)。
3. 异常数(ERROR_COUNT)
核心逻辑:当资源的异常请求总数超过阈值时,触发熔断,适合异常数累积触发的场景。
关键参数:
- 异常数阈值:单位统计时长内,允许的最大异常请求数(如 5 次);
- 熔断时长(毫秒):熔断后拒绝调用的时间;
- 统计时长:默认 60000ms(1 分钟,与前两种策略的秒级统计不同)。
触发条件:
单位统计时长内,异常请求数 ≥ 异常数阈值(无需判断请求总数,只要异常数达标即触发)。
状态转换:
与 “异常比例” 策略一致,熔断后通过单请求探测恢复。
适用场景:
- 异常数可预期的场景(如每日允许 3 次支付失败,超过则熔断);
- 需严格控制异常总数的接口(如敏感操作接口,多次失败后暂时关闭)。
Dashboard 配置示例
以 “异常比例” 策略为例,配置步骤如下:
- 登录 Sentinel Dashboard,选择目标服务;
- 进入 “簇点链路”,找到需降级的资源(如
/order/pay
),点击 “降级”; - 配置规则:
- 资源名:
/order/pay
; - 熔断策略:异常比例;
- 比例阈值:0.5(50%);
- 最小请求数:5;
- 熔断时长:10000(10 秒);
- 资源名:
- 点击 “新增”,规则立即生效。
当/order/pay
接口每秒请求≥5 次,且异常比例≥50% 时,会触发 10 秒熔断,期间所有请求被拒绝。
熔断状态与监控
Sentinel Dashboard 的 “实时监控” 页面可查看资源的熔断状态:
- CLOSED(正常):资源正常调用,无熔断;
- OPEN(熔断):资源被熔断,请求被拒绝;
- HALF-OPEN(探测恢复):熔断结束,尝试恢复调用。
通过监控指标(如异常数、慢调用数)可分析熔断原因,优化资源稳定性。
注意事项
统计时长差异:
- 慢调用比例、异常比例的统计时长为1 秒;
- 异常数的统计时长为1 分钟,配置时需注意阈值与时长的匹配(如 1 分钟内允许 5 次异常)。
最小请求数:
慢调用比例和异常比例策略中,“最小请求数” 是避免少量请求误判的关键(如 1 次请求失败就触发熔断),建议根据接口 QPS 设置(如 QPS=100,最小请求数可设为 10)。RT 阈值调整:
慢调用比例的 “最大 RT” 默认 4900ms,若业务接口正常响应时间更长(如 6000ms),需通过 JVM 参数调整:1
java -jar app.jar -Dcsp.sentinel.statistic.max.rt=6000 # 设置最大RT为6000ms
降级与流控结合:
实际场景中,流控(限制流量入口)与降级(保护故障资源)通常结合使用,形成 “多层防护”(如先限流削峰,再降级隔离故障)。
总结
Sentinel 的熔断降级通过三种策略实现了对资源异常的精准控制:
- 慢调用比例:关注响应速度,避免调用方阻塞;
- 异常比例:关注错误率波动,适合偶发故障;
- 异常数:关注错误累积,适合严格控制异常总量的场景
v1.3.10