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

问题描述

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

我使用的是 1.5 版

解决方法

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

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

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