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
相关产品推荐
相关产品推荐

