Skip to content

参考:Opossum 配置、事件与三态速查

基于 Opossum 8.x · 核于 2026-08

速查

  • Opossum:Red Hat 维护的 Node.js 熔断器库,把异步函数包进熔断器,错误率超阈值就跳闸快速失败,防雪崩。
  • 三态:Closed(正常放行+统计)、Open(全拒快速失败)、Half-Open(放一个试探恢复)。
  • 错误率:窗口内失败数 / 总调用数,超 errorThresholdPercentage(默认 50%)跳闸。
  • fallback:熔断或失败时的兜底函数,返回缓存/默认值,保业务降级可用。
  • 核心配置:timeout(默认 10s)、errorThresholdPercentage(默认 50)、resetTimeout(默认 30s)、rollingCountTimeout(默认 10s)、rollingCountBuckets(默认 10)、volumeThreshold(默认 0)。
  • 事件:success/failure/timeout/reject/open/close/halfOpen/fallback/semaphoreLocked。
  • vs circuit-breaker-js:后者 2013 年停更(12 年+),Opossum 是 Node.js 事实标准。
  • 容错组合:超时 + 重试 + 熔断 + 降级 + 限流,单一模式不够。

一、熔断器三态转换图

                  错误率 > 阈值 且 调用量 ≥ volumeThreshold
        ┌──────────────────────────────────────────┐
        ▼                                          │
   ┌─────────┐                                ┌─────────┐
   │ Closed  │                                │  Open   │
   │ (放行)  │◄────── halfOpen 试探成功 ──────│ (全拒)  │
   │ +统计   │                                │ +fallback│
   └─────────┘                                └─────────┘
        ▲                                          │
        │                                  resetTimeout 到期
        │                                          ▼
        │            ┌──────────────┐        ┌──────────┐
        └────────────│  Half-Open   │◄───────│  (放一个  │
          试探成功   │  (试探一个)  │ 切入   │  请求)    │
                     └──────────────┘        └──────────┘

                            │ 试探失败

                     回 Open(再等 resetTimeout)
转换触发条件事件
Closed → Open错误率超阈值 + 调用量达标open
Open → Half-OpenresetTimeout 到期halfOpen
Half-Open → Closed试探请求成功close
Half-Open → Open试探请求失败open

二、配置项速查

配置项类型默认值说明
timeoutNumber/false10000单次调用超时(ms),false 禁用
errorThresholdPercentageNumber50错误率跳闸阈值(%)
resetTimeoutNumber30000Open 后多久试探(ms)
rollingCountTimeoutNumber10000统计窗口长度(ms)
rollingCountBucketsNumber10窗口分桶数
volumeThresholdNumber0最小调用量才统计
maxCapacityNumber无限最大并发调用数
maxFailuresNumber-已废弃,用 errorThresholdPercentage 替代
cacheBooleanfalse是否缓存成功结果
enabledBooleantrue是否启用熔断
nameString自动生成熔断器名(用于日志/指标)
healthCheckFuncFunction-自定义健康检查函数

生产调参建议

场景timeouterrorThresholdPercentageresetTimeoutvolumeThreshold
快速 API1-2s30-5010-15s5
普通服务3-5s5030s5-10
慢操作(如报表)10-30s50-6060s3
  • 禁忌:①timeout 留默认 10s(太长,失去保护);②volumeThreshold 留默认 0(低调用量误判);③errorThresholdPercentage 设太低(正常抖动就跳闸)。

三、事件清单

事件触发时机用途
fire发起一次调用调用日志
success调用成功成功计数
failure调用失败(业务异常)错误日志/告警
timeout调用超时超时监控
rejectOpen/Half-Open 时拒绝熔断生效计数
openClosed → Open熔断告警(下游故障)
closeHalf-Open → Closed恢复通知
halfOpenOpen → Half-Open试探开始
fallback触发降级降级监控
semaphoreLocked并发达 maxCapacity限流计数
healthCheckFailed健康检查失败下游探活失败
shutdown熔断器关闭生命周期

四、容错模式对比

模式解决问题与熔断器关系
超时单次调用无限等待熔断器内部配超时,超时是失败依据之一
重试瞬时失败提高成功率熔断 Open 时停止重试(联动)
限流入口流量过载与熔断方向不同(入口 vs 出口),互补
舱壁资源被一个故障耗尽maxCapacity 是简化舱壁
降级故障保业务可用熔断器的 fallback 就是降级

五、Node.js 熔断器选型

状态推荐
OpossumRed Hat 维护,活跃✅ Node.js 事实标准
circuit-breaker-js2013 年停更(12 年+)❌ 不要用
cockatiel活跃,熔断+重试+舱壁备选(功能更全)
opossum(Red Hat Build)企业版企业场景首选

六、易错点清单

  • 「熔断器能修复下游故障」:错。熔断器只是「症状治疗」——下游真挂了还得修,它只争取时间防级联,让上游活下来。
  • 「熔断器 Open 就完全不调下游了」:对主路径而言是对的(Open 时直接 reject/fallback)。但 Half-Open 时会放一个请求试探——这是「调一次」的例外。
  • 「volumeThreshold 留默认 0 没问题」:错。默认 0 意味着调 1 次失败(错误率 100%)就跳闸,正常抖动会误熔断。生产必设非零。
  • 「fallback 成功就不算失败」:错。Opossum 里触发 fallback 仍计为失败(主路径没成功),错误率继续累积,直到 Closed 恢复主路径。
  • 「熔断器和限流是一回事」:错。限流主动控制入口流量(防自己被过载),熔断被动反应下游故障(防自己被拖垮),方向不同。
  • 「重试越多越好」:错。下游真挂时重试放大流量冲击下游(重试风暴)。要配熔断器联动——Open 时停止重试。
  • 「timeout 设长一点更安全」:错。timeout 太长(如默认 10s)下游慢时上游资源被占满,失去保护。生产调小到秒级。
  • 「Half-Open 立刻放全部流量」:错。Half-Open 只放一个请求试探——下游可能刚恢复还很脆弱,放全部会再打挂。
  • 「circuit-breaker-js 和 Opossum 差不多」:错。circuit-breaker-js 已停更 12 年+,功能简陋、无人维护;Opossum 是 Red Hat 维护的活跃项目。新项目必选 Opossum。
  • 「Opossum 能跨语言用」:错。Opossum 是 Node.js 库,跨语言不通。Java 用 Resilience4j、Go 用 sony/gobreaker——各自生态内选各自的标准。

权威链接