熔断进入 HALF_OPEN 后配置允许 20 个请求通过,这 20 个里有 7 个仍然超时,失败率 35% 又超过阈值,直接回到 OPEN。日志里 HALF_OPEN 每次只停留 200 毫秒,一天出现 300 多次。乍看像缓存或者权限的锅,追下去往往不是。
grep -n 'permittedNumberOfCallsInHalfOpenState\|failureRateThreshold' config/application.yml curl -s localhost:8081/actuator/metrics/resilience4j.circuitbreaker.state | jq '.measurements'
追下去是这么回事:半开状态的放行数量按正常流量比例算,探测窗口里混进了真实用户请求。阈值没为半开单独设置,用的还是闭合状态的失败率。
「半开状态配置」这个问题文档写得含糊,实际行为以当前版本为准,别照旧版本的结论套。接口问题先分清是没发出去、发出去了没收到,还是收到了处理失败。
偶发问题先统计频率,一小时几次和一天一次,查法完全不同。
具体做法是,半开只放 3 到 5 个探测请求 并且只让内部探针走;给半开单独设判定条件 比如连续 3 次成功就闭合;探测请求打独立接口 不要混业务流量;统计 HALF_OPEN 停留时长和次数 判断是否在震荡。
验收就看一点,半开状态每次停留至少 10 秒,一天状态切换次数降到个位数,依赖恢复后能稳定回到 CLOSED。
