circuit-breaker - HALF_OPEN 状态下断路器的行为如何(resilience4j)
问题描述
有时我会看到 CallNotPermittedException 并显示断路器处于 HALF_OPEN 状态的消息。但我不明白它在那种状态下是如何工作的。我已经用一个模拟服务器编写了一个测试,其中我允许 NumberOfCallsInHalfOpenState=2 然后我将 3 个调用排队并延迟(3 秒)并调用,下一个调用将失败,并显示 CallNotPermittedException 和 HALF_OPEN 消息。但是,如果我等待 3 秒(足以让呼叫完成)并进行下一次呼叫,那么 CB 现在处于关闭状态。从 HALF_OPEN 到另一个状态的转换如何?它要等一段时间吗?或者只是“permittedNumberOfCallsInHalfOpenState”来完成?那为什么我必须打 3 个电话而不是 2 个电话?
我正在使用 1.5 版
解决方案
CircuitBreaker 在 OPEN 时拒绝带有 CallNotPermittedException 的呼叫。在等待时间过去后,CircuitBreaker 状态从 OPEN 变为 HALF_OPEN 并允许可配置数量的调用以查看后端是否仍然不可用或再次可用。进一步的调用将被 CallNotPermittedException 拒绝,直到所有允许的调用都完成。如果失败率或慢速调用率等于或大于配置的阈值,则状态变回 OPEN。如果失败率和慢调用率低于阈值,则状态变回 CLOSED。
这意味着如果您有 3 个处于 HALF_OPEN 状态的并发调用,则允许 2 个,拒绝 1 个。
但是,如果在执行第三次调用之前 2 次调用成功,CircuitBreaker 将转换为 CLOSED 并允许第三次调用。
推荐阅读
- django - django,找不到静态文件 404
- c - 字符串变量在 C 中没有正确返回
- javascript - JS 函数 - 比较 2 个对象数组(每个数组中都有数组对象)
- maven - 未找到 Multipart 功能的注入源
- android - 根据片段和活动按下后退按钮时如何同步操作栏
- javascript - d3正负对数刻度怎么写
- angular - Angular - Observables 组合结果多次调用
- haskell - 在使用 HXT 进行解析期间捕获和停止语法异常
- ios - 自定义编写的 iOS 原生模块未导出
- javascript - ReactJS:从表单中获取数据