📖 主要讲解熔断降级 之 --- 异常比例阈值 🚀
1️⃣ 背景
Sentinel 以流量作为切入点,提供了很多的丰富的功能,例如🤗: 流量控制,熔断降级等,它能够有效的适用各个复杂的业务场景,如削峰填谷,集群的流量控制等。在这些场景中,异常比例阈值作为 Sentinel 熔断降级规则中的一个重要参数,起着至关重要的作用。当某个服务的异常比例 超过设定的阈值时,Sentinel 会自动触发熔断机制,迅速切断对该服务的请求,避免因持续异常导致资源耗尽,从而防止故障的扩散,进而保障了整个系统的稳定性。
2️⃣ 目的
这篇文章我们将探讨熔断降级🚨 之异常比例数,我们希望达成以下具体的目标
- ✅深入剖析异常比例阈值的核心思想和熔断机制。
- ✅详细解读异常比例阈值相关的 核心参数 。
- ✅通过实际的代码示例和案例分析,展示异常比例阈值在不同场景下的配置方法和应用效果
4. ✅总结异常比例阈值配置的最佳实践和注意事项。
3️⃣ 核心思想
核心思想😍 :当某个服务的 🔜 响应时间变慢 ,并且💔 慢请求的比例超过一定阈值时,系统自动触发熔断。
目的🉑 : 避免无效请求占用资源,从而防止持续异常导致资源耗尽,保障了分布式系统的稳定性和可用性。
4️⃣ 熔断机制
✅ 统计窗口:系统会设定一个时间窗口(如10秒),在这个窗口内统计请求的异常情况。
✅ 异常比例计算:在统计窗口内,计算异常请求数占总请求数的比例。
✅阈值触发:当异常比例超过预设的阈值(如50%)时,触发熔断。
✅ 熔断开启:熔断器打开,后续请求直接快速失败,不再调用实际服务。
✅恢复尝试:经过设定的熔断时长后,熔断器会进入半开状态,允许少量请求通过以测试服务是否恢复。
流程图如下👉

5️⃣ 核心参数
核心参数说明🤖:
参数 | 含义 | 示例值 | 作用 |
---|---|---|---|
grade |
熔断策略类型 | ERROR_RATIO |
指定按异常比例熔断 |
count |
异常比例阈值 | 0.5 (50%) |
异常请求占比超过此值时触发熔断 |
timeWindow |
熔断持续时间 | 10 (秒) |
熔断后10秒进入半开状态(试探恢复) |
minRequestAmount |
最小请求数 | 10 |
统计窗口内请求数≥10才计算比例 |
statIntervalMs |
统计窗口长度 | 10000 (10秒) |
每10秒统计一次异常比例 |
6️⃣ 代码事例
下面是一段配置异常比例阈值熔断规则的关键代码
java
public static void initErrorRatioRule() {
List<DegradeRule> rules = new ArrayList<>();
DegradeRule rule = new DegradeRule();
rule.setResource("error_service");
rule.setGrade(CircuitBreakerStrategy.ERROR_RATIO.getType());
rule.setCount(0.5);
rule.setTimeWindow(10);
rule.setMinRequestAmount(5);
rule.setStatIntervalMs(1000);
rules.add(rule);
DegradeRuleManager.loadRules(rules);
}
✅代码说明:
1.创建规则列表 :这行代码创建了一个DegradeRule类型的列表rules,用于存储熔断规则。
java
List<DegradeRule> rules = new ArrayList<>();
2.创建单个熔断规则 :用于配置具体的熔断规则。
java
DegradeRule rule = new DegradeRule();
3.设置资源名 :保护的资源名称为error_service。在 Sentinel 中,资源是一个抽象概念,可以是一个方法、一 个接口、一个服务等。通过指定资源名,Sentinel 可以对该资源进行监控和规则应用。
java
rule.setResource("error_service");
4.设置熔断策略类型:熔断策略类型设置为ERROR_RATIO,即按异常比例熔断。这表示 Sentinel 会根据异常比例来判断 是否触发熔断。
java
rule.setGrade(CircuitBreakerStrategy.ERROR_RATIO.getType());
5.**设置异常比例阈值:**设置异常比例阈值为 0.5,即 50%。当在统计窗口内,该资源的异常请求比例超过 50% 时,就满足了 触发熔断的一个条件。
java
rule.setCount(0.5);
- **设置熔断持续时间:**设置熔断持续时间为 10 秒。当触发熔断后,在接下来的 10 秒内,对该资源的请求将被熔断,即直接 返回,而不会实际调用服务。10 秒后,熔断器会进入半开状态,进行试探性恢复。
java
rule.setTimeWindow(10);
7.**设置最小请求数:**在统计窗口内,只有请求数大于或等于 5 时,才会计算异常比例并判断是否触发熔断。如果请求数小于 5,即使异常比例超过阈值,也不会触发熔断。这是为了避免因请求数过少导致的误判。
java
rule.setMinRequestAmount(5);
8.**设置统计窗口长度:**设置统计窗口长度为 1000 毫秒,即 1 秒。Sentinel 会每 1 秒统计一次该资源的请求情况,包括总请求数、异常请求数等,以计算异常比例并判断是否满足熔断条件。
java
rule.setStatIntervalMs(1000);
9.加载熔断规则:
java
rules.add(rule);
DegradeRuleManager.loadRules(rules);
触发条件🈲
-
在10秒统计窗口内:
-
总请求数 ≥
minRequestAmount
(5次)。 -
异常请求比例 >
count
(50%)。 -
示例
-
总请求数:20次。
-
异常请求数:12次。
-
异常比例:12/20 = 60% > 50% → 触发熔断。
-
-
模拟调用🔧
java
import com.alibaba.csp.sentinel.Entry;
import com.alibaba.csp.sentinel.SphU;
import com.alibaba.csp.sentinel.slots.block.BlockException;
public class ErrorRatioSimulator {
public static void main(String[] args) {
// 1. 初始化熔断规则
ErrorRatioCircuitBreakerDemo.initErrorRatioRule();
// 2. 模拟请求(50%概率抛出异常)
while (true) {
Entry entry = null;
try {
entry = SphU.entry("orderService");
// 随机生成异常(50%概率)
if (Math.random() > 0.5) {
throw new RuntimeException("Mock Error");
}
System.out.println("请求成功");
} catch (BlockException e) {
System.out.println("请求被熔断拦截");
} catch (Exception e) {
// 业务异常会计入统计
System.out.println("请求异常: " + e.getMessage());
} finally {
if (entry != null) {
entry.exit();
}
}
}
}
}
7️⃣ 最佳实践和注意事项
不同业务场景对异常的容忍度和影响程度差异巨大。对于电商支付等关键业务,任何异常都可能导致资金损失或用户流失,应设置较低的异常比例阈值,如 10% - 20%,以确保服务的高可用性;而对于一些非关键业务,如商品评论的加载服务,异常比例阈值可适当提高至 30% - 50%,在保证基本服务质量的前提下,减少不必要的熔断。同时,要考虑业务的流量高峰和低谷期。在高峰时,系统负载高,服务出现短暂异常的可能性增加,可适当放宽阈值;低谷时,系统资源充足,可收紧阈值,更严格地监控服务质量等。
8️⃣ 总结🚀
与基于异常数的熔断策略相比,异常比例阈值策略在关注服务异常情况、适应请求量波动场景等方面具有独特优势,但也存在对异常分布不均匀情况处理不足等问题。在应用实践中,合理设置参数、建立完善的监控与调整策略是确保异常比例阈值有效发挥作用的关键。