断路器在 HALF_OPEN 状态下的行为如何(resilience4j)

ale*_*rth 4 circuit-breaker resilience4j

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

我用的是1.5版本

小智 11

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

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

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