首页 > 解决方案 > HALF_OPEN 状态下断路器的行为如何(resilience4j)

问题描述

有时我会看到 CallNotPermittedException 并显示断路器处于 HALF_OPEN 状态的消息。但我不明白它在那种状态下是如何工作的。我已经用一个模拟服务器编写了一个测试,其中我允许 NumberOfCallsInHalfOpenState=2 然后我将 3 个调用排队并延迟(3 秒)并调用,下一个调用将失败,并显示 CallNotPermittedException 和 HALF_OPEN 消息。但是,如果我等待 3 秒(足以让呼叫完成)并进行下一次呼叫,那么 CB 现在处于关闭状态。从 HALF_OPEN 到另一个状态的转换如何?它要等一段时间吗?或者只是“permittedNumberOfCallsInHalfOpenState”来完成?那为什么我必须打 3 个电话而不是 2 个电话?

我正在使用 1.5 版

标签: circuit-breakerresilience4j

解决方案


CircuitBreaker 在 OPEN 时拒绝带有 CallNotPermittedException 的呼叫。在等待时间过去后,CircuitBreaker 状态从 OPEN 变为 HALF_OPEN 并允许可配置数量的调用以查看后端是否仍然不可用或再次可用。进一步的调用将被 CallNotPermittedException 拒绝,直到所有允许的调用都完成。如果失败率或慢速调用率等于或大于配置的阈值,则状态变回 OPEN。如果失败率和慢调用率低于阈值,则状态变回 CLOSED。

这意味着如果您有 3 个处于 HALF_OPEN 状态的并发调用,则允许 2 个,拒绝 1 个。

但是,如果在执行第三次调用之前 2 次调用成功,CircuitBreaker 将转换为 CLOSED 并允许第三次调用。


推荐阅读