深入解析Sentinel熔断机制

以下内容来自于 Sentinel 的熔断降级(Degrade)机制,主要包括:

  1. DegradeRule:熔断规则的定义
  2. 两个 onRequestComplete() 方法(分别对应 慢调用比例异常比例/计数 两种熔断策略)
  3. 熔断状态机(CLOSE → OPEN → HALF_OPEN → CLOSE)的触发逻辑

下面我将系统性地解释这些内容,帮助你深入理解 Sentinel 的熔断机制是如何工作的。


🔍 一、DegradeRule:熔断规则的核心配置

java 复制代码
public class DegradeRule extends AbstractRule {
    private int grade;          // 熔断策略类型
    private double count;       // 阈值(含义取决于 grade)
    private int timeWindow;     // 熔断后恢复时间(秒)
    private int minRequestAmount; // 最小请求数(防止统计噪声)
    private double slowRatioThreshold; // 慢请求比例阈值(仅 RT 模式)
    private int statIntervalMs; // 统计窗口长度(毫秒,默认 1000ms)
}

✅ 三种熔断策略(grade

常量 含义 count 的含义
0 DEGRADE_GRADE_RT 平均响应时间(RT) 最大允许 RT(毫秒)
1 DEGRADE_GRADE_EXCEPTION_RATIO 异常比例 异常比例阈值(0.0 ~ 1.0)
2 DEGRADE_GRADE_EXCEPTION_COUNT 异常数量 每秒异常数阈值

📌 注意:从 Sentinel 1.8 开始,RT 模式不再看"平均 RT",而是看"慢请求比例"


🧠 二、RT 模式(慢调用比例)的工作原理

📄 规则说明(来自你的注释):

接下来的 5 个请求 的 RT 都超过阈值,才触发熔断。

但这是 旧版逻辑(1.7 及之前)
1.8+ 版本已改为基于滑动窗口的"慢请求比例"判断,更科学。

🔁 新逻辑(1.8+)关键参数:

  • count:最大允许 RT(比如 200ms)
  • slowRatioThreshold:慢请求比例阈值(比如 0.5 = 50%)
  • minRequestAmount:最小请求数(比如 5),低于此数不触发熔断
  • statIntervalMs:统计窗口(默认 1000ms)

📊 onRequestComplete()(RT 模式)做了什么?

java 复制代码
public void onRequestComplete(Context context) {
    long rt = completeTime - createTimestamp;
    if (rt > maxAllowedRt) {
        counter.slowCount.add(1); // 记录慢请求
    }
    counter.totalCount.add(1);    // 总请求数 +1

    handleStateChangeWhenThresholdExceeded(rt);
}
handleStateChangeWhenThresholdExceeded() 核心逻辑:
  1. 如果当前是 OPEN 或 HALF_OPEN:只处理探测请求(见下文)
  2. 否则(CLOSE 状态)
    • 从滑动窗口中汇总:slowCounttotalCount
    • 如果 totalCount < minRequestAmount → 不判断(数据不足)
    • 计算慢请求比例:currentRatio = slowCount / totalCount
    • 如果 currentRatio > slowRatioThreshold触发熔断(OPEN)

✅ 举例:

  • count = 200(RT > 200ms 算慢)
  • slowRatioThreshold = 0.6
  • 过去 1 秒内有 10 个请求,其中 7 个 RT > 200ms → 比例 70% > 60% → 熔断!

⚠️ 三、异常模式(异常比例 / 异常数)的工作原理

onRequestComplete()(异常模式):

java 复制代码
public void onRequestComplete(Context context) {
    Throwable error = entry.getError(); // 通过 Tracer.trace(ex) 标记的异常
    if (error != null) {
        counter.errorCount.add(1);
    }
    counter.totalCount.add(1);

    handleStateChangeWhenThresholdExceeded(error);
}
判断逻辑:
java 复制代码
double curCount = errCount;
if (strategy == EXCEPTION_RATIO) {
    curCount = errCount * 1.0 / totalCount; // 转为比例
}
if (curCount > threshold) {
    transformToOpen(curCount);
}

✅ 举例(异常比例):

  • count = 0.5(50% 异常率)

  • 1 秒内 10 个请求,5 个抛异常 → 比例 50% ≥ 阈值 → 熔断!
    ✅ 举例(异常数):

  • count = 5(每秒 5 个异常)

  • 1 秒内 6 个异常 → 熔断!


🔁 四、熔断状态机(State Machine)

Sentinel 的熔断器有三种状态:

状态 行为
CLOSE 正常放行请求,统计 RT/异常
OPEN 直接拒绝所有请求 (抛 DegradeException),不执行业务
HALF_OPEN 放行一个探测请求,根据结果决定是否恢复

🔄 状态转换逻辑

1. CLOSE → OPEN
  • 满足熔断条件(慢比例/异常比例超标)
  • 调用 transformToOpen()
  • 启动定时任务:timeWindow 秒后自动切换到 HALF_OPEN
2. OPEN → HALF_OPEN
  • 由后台定时任务触发(非请求驱动)
3. HALF_OPEN → ?
  • 放行下一个请求 作为探测:
    • 成功(无异常 & RT 正常)fromHalfOpenToClose() → 恢复
    • 失败(异常 or 慢)fromHalfOpenToOpen() → 再次熔断

💡 注意:目前 Sentinel 的 HALF_OPEN 只探测 一个请求,不是多个。


🧩 五、关键设计思想总结

特性 说明
基于滑动窗口统计 使用 LeapArray 实现高精度、低内存的实时统计
防误判机制 minRequestAmount 避免低流量时因个别慢请求误熔断
快速失败 OPEN 状态下直接拒绝,不消耗资源
自动恢复 timeWindow 后自动尝试恢复(HALF_OPEN)
策略灵活 支持 RT、异常比例、异常数三种主流熔断场景

📌 六、使用建议

  1. RT 模式

    • 设置合理的 slowRatioThreshold(如 0.5)
    • minRequestAmount 至少设为 5~10
    • timeWindow 建议 5~30 秒(避免频繁震荡)
  2. 异常模式

    • 确保业务代码中通过 Tracer.trace(ex) 上报异常
    • 异常比例适合稳定流量场景;异常数适合突发流量
  3. 监控

    • 观察 metric.log 中的 RT 和异常统计
    • 结合 Dashboard 查看熔断状态变化

✅ 举个完整例子

java 复制代码
// 配置:当 /order 接口慢请求比例 > 60%,且最小请求数 >= 10,熔断 10 秒
DegradeRule rule = new DegradeRule("GET:/order")
    .setGrade(RuleConstant.DEGRADE_GRADE_RT)
    .setCount(300)                  // RT > 300ms 算慢
    .setSlowRatioThreshold(0.6)     // 慢请求比例 > 60%
    .setMinRequestAmount(10)
    .setTimeWindow(10);             // 熔断 10 秒

DegradeRuleManager.loadRules(Collections.singletonList(rule));

❓常见问题

Q:为什么我的熔断没触发?

A:检查:

  • 是否达到 minRequestAmount
  • 是否真的有慢请求/异常(通过 Tracer.trace() 上报)
  • statIntervalMs 是否太短(默认 1s,一般不用改)

Q:HALF_OPEN 为什么只试一次?

A:Sentinel 设计如此,简化实现。如需更健壮,可自行扩展 CircuitBreaker


✅ 总结

你看到的代码体现了 Sentinel 现代熔断器 的核心思想:

"基于实时指标 + 滑动窗口 + 状态机" 实现自适应熔断

它不再是简单的"连续 N 次失败就熔断",而是:

  • 更精准(比例 vs 绝对次数)
  • 更稳定(防抖:minRequestAmount)
  • 更智能(自动探测恢复)

理解这些,你就能合理配置熔断规则 ,并在系统出现不稳定时快速定位问题

相关推荐
踢球的打工仔13 分钟前
typescript-类的访问权限public、private、protected
前端·javascript·typescript
Ulyanov18 分钟前
Impress.js深度解析
开发语言·前端·javascript·css3·impress.js
醇氧21 分钟前
Spring WebFlux 学习
java·学习·spring
烤麻辣烫22 分钟前
23种设计模式(新手)-9单例模式
java·开发语言·学习·设计模式·intellij-idea
资生算法程序员_畅想家_剑魔30 分钟前
Java常见技术分享-设计模式的六大原则
java·开发语言·设计模式
Cherry的跨界思维42 分钟前
【AI测试全栈:质量】40、数据平权之路:Python+Java+Vue全栈实战偏见检测与公平性测试
java·人工智能·python·机器学习·ai测试·ai全栈·ai测试全栈
刀法如飞43 分钟前
从零手搓一个类Spring框架,彻底搞懂Spring核心原理
java·设计模式·架构设计
毕设源码-邱学长1 小时前
【开题答辩全过程】以 基于java的办公自动化系统设计为例,包含答辩的问题和答案
java·开发语言
weixin199701080161 小时前
马可波罗 item_get - 获取商品详情接口对接全攻略:从入门到精通
java·大数据·人工智能
我叫Double1 小时前
GeneralAdmin-3
前端·javascript·vue.js