降级规则与自定义降级处理

引言:降级不等于"失败" 在前面两篇文章中,我们学习了熔断的原理和三种熔断策略。我们知道,当熔断器开启时,Sentinel会停止调用依赖服务,快速返回。 但问题来了:快速返回什么呢? 很多初学者会认为:熔断就是"快速失败",返回一个错误。 这种理解是片面的! 想象这样一个场景: 你在电商平台上浏览商品详情页。此时商品服务的推荐模块因为故障被熔断了。 糟糕的降级:页面直接显示"服务异常,请稍后重试" 用户体验差 用户可能直接离开 业务受损 优雅的降级:推荐模块不显示,但商品详情、库存、价格等核心信息正常展示 用户看不出异常 核心功能不受影响 业务损失最小 这就是优雅降级的艺术:让系统在故障时仍然能提供有限但可用的服务。 本文将深入讲解如何实现优雅的降级处理。 默认降级处理:快速失败 Sentinel的默认行为 当熔断器开启时,Sentinel的默认行为是: 拦截对资源的访问 抛出DegradeException(继承自BlockException) 业务代码需要捕获这个异常并处理 代码示例 import com.alibaba.csp.sentinel.Entry; import com.alibaba.csp.sentinel.SphU; import com.alibaba.csp.sentinel.slots.block.BlockException; import com.alibaba.csp.sentinel.slots.block.degrade.DegradeException; public class DefaultFallbackDemo { public static void main(String[] args) { // 假设已经配置了熔断规则,并且熔断器已开启 try (Entry entry = SphU.entry("queryProductDetail")) { // 业务逻辑:查询商品详情 System.out.println("查询商品详情成功"); } catch (DegradeException e) { // 熔断降级 System.out.println("服务降级:" + e.getClass().getSimpleName()); } catch (BlockException e) { // 其他限流、系统保护等 System.out.println("被限流或保护:" + e.getClass().getSimpleName()); } } } 输出: ...

2025-11-20 · maneng

熔断策略:慢调用比例、异常比例、异常数

引言:不同的"病症"需要不同的"药方" 在上一篇文章中,我们学习了熔断降级的原理和熔断器的状态机。我们知道,熔断的本质是检测故障 → 快速失败 → 自动恢复。 但问题来了:如何判断依赖服务"生病"了? 就像医生诊断疾病,需要看不同的指标: 体温高不高?(响应时间) 心率正常吗?(异常比例) 咳嗽了几声?(异常次数) Sentinel也提供了三种熔断策略,分别针对不同的故障模式: 慢调用比例(Slow Request Ratio):依赖服务变慢了 异常比例(Exception Ratio):依赖服务频繁抛异常 异常数(Exception Count):依赖服务在短时间内抛了太多异常 本文将深入讲解这三种策略的原理、配置方法和适用场景。 策略一:慢调用比例(Slow Request Ratio) 什么是慢调用? 慢调用是指响应时间(RT)超过设定阈值的请求。 例如: 设置慢调用阈值为1000ms 某个请求的响应时间是1200ms 这个请求就被认为是"慢调用" 慢调用比例的触发条件 熔断触发条件:在统计时长内,慢调用的比例超过设定阈值,且请求数达到最小请求数。 公式: 慢调用比例 = 慢调用数 / 总请求数 如果:慢调用比例 >= 设定阈值,且 总请求数 >= 最小请求数 则:触发熔断 示例: 统计时长:10秒 慢调用RT阈值:1000ms 慢调用比例阈值:50% 最小请求数:5 场景1:10秒内有10个请求,其中6个RT > 1000ms 慢调用比例 = 6/10 = 60% > 50% ✅ 请求数 = 10 >= 5 ✅ 结论:触发熔断 场景2:10秒内有3个请求,其中2个RT > 1000ms 慢调用比例 = 2/3 = 67% > 50% ✅ 请求数 = 3 < 5 ❌ 结论:不触发熔断(请求数太少,可能是偶发) 配置参数详解 DegradeRule rule = new DegradeRule(); rule.setResource("callRemoteService"); rule.setGrade(RuleConstant.DEGRADE_GRADE_RT); // 策略:慢调用比例 // 核心参数 rule.setCount(1000); // 慢调用RT阈值:1000ms rule.setSlowRatioThreshold(0.5); // 慢调用比例阈值:50% rule.setMinRequestAmount(5); // 最小请求数:5 rule.setStatIntervalMs(10000); // 统计时长:10秒 rule.setTimeWindow(10); // 熔断时长:10秒 参数说明: ...

2025-11-20 · maneng

如约数科科技工作室

浙ICP备2025203501号

👀 本站总访问量 ...| 👤 访客数 ...| 📅 今日访问 ...