You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Resilience4j CircuitBreaker与Retry整合问题:多次失败未触发熔断

Resilience4j Retry与CircuitBreaker整合问题排查与解决

你的问题核心是装饰顺序搞反了,导致断路器没统计到重试过程中的多次失败。

问题原因

你现在的代码是用CircuitBreaker包裹Retry,也就是断路器把整个重试流程当成单次调用——不管重试10次全失败,断路器只会记录这一次调用的最终结果(失败),自然永远达不到5次失败的熔断阈值,所以一直保持CLOSED状态。

解决方法

把装饰顺序反过来:让Retry包裹CircuitBreaker,这样重试的每一次调用都会经过断路器,每一次失败都会被断路器统计,当失败次数达到阈值时就会触发熔断。

修改后的代码片段:

// 先用电容器装饰原始调用
Supplier<String> circuitSupplier = CircuitBreaker.decorateSupplier(circuitBreaker, retrySupplier);
// 再用重试装饰经过电容器的调用
Supplier<String> decoratedRetrySupplier = Retry.decorateSupplier(retry, circuitSupplier);
// 执行调用
decoratedRetrySupplier.get();

补充说明

  • 你的异常记录配置是对的:504属于HttpServerErrorException,会被正确标记为失败。
  • 熔断触发逻辑:当断路器统计到5次失败后,失败率100%超过了你设置的50%阈值,会立刻切换到OPEN状态,后续的重试调用会直接被熔断拦截,不会真的发起请求到serviceB。

内容的提问来源于stack exchange,提问作者raveen

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 13:41:12