熔断器是由依赖调用证据驱动的状态机。有效的复核要查清什么算失败、何时在本地拒绝流量、恢复探测如何限流,以及什么事件会关闭或重新打开熔断器。

定义状态契约

检查状态名称之前,先收集失败计数口径、滚动或连续窗口、触发阈值、打开时长、半开探测额度、并发限制,以及成功或失败后的状态转移。任何值缺失时都应保留为未知,不要擅自采用默认值。

状态或转移需要依据契约验证的行为
Closed哪些依赖结果计入失败,如何加入已配置的时间窗口?
Open普通调用是否在本地拒绝,返回哪种兜底结果?
Half-open允许多少恢复探测并发,普通调用如何处理?
重置/恢复转移哪种探测结果和时间条件会让熔断器关闭或重新打开?具体名称与规则以项目契约为准。

真实依赖请求和本地拒绝必须分开。只有在配置策略明确时才计入相应数量;状态标签本身不能证明实现遵守了契约。

按事件追踪一次状态转移

不要只罗列状态名称,应建立带请求身份的时间线:

事件状态与计数预期动作要保留的证据
依赖调用返回契约定义的失败Closed;更新已配置的窗口达到文档化触发条件前保持关闭请求 ID、结果、时间戳
达到触发条件Closed 转为 Open停止向依赖发送普通调用转移事件和本地拒绝证据
打开时长结束Open 转为 Half-open只允许规定数量的恢复探测探测身份、并发数、时间戳
探测成功或失败Half-open 转为 Closed 或 Open按文档化规则转移状态并处理兜底探测结果和后续状态

这张表说明的是复核方法,不是替项目假设策略。要使用实际提供的阈值和事件记录。日志缺失时,应把转移标成预期或未验证,而不是声称观察到了转移。

示例:区域性超时

复核一个受熔断器保护的推荐服务发生区域性超时时的候选序列。确认哪些调用会计入失败窗口、Open 期间被本地拒绝的调用是否计数、半开探测能否并发,以及探测失败后是否立即重新打开,还是执行其他已记录规则。

验证建议应限定在隔离环境并设置停止条件,分别观察依赖请求与本地拒绝,同时保存状态和兜底证据。不要在生产环境制造故障,也不要为示例编造阈值。

判读时要把状态标签和请求行为分开。说明性例子:如果仪表盘显示 Open,但没有转移事件、请求身份或依赖调用记录,只能说明视图展示了一个状态,不能证明普通调用已在本地被拒绝。若策略规定 Open 期间应拒绝,而同一时间窗仍有普通调用到达依赖,就应保留请求级证据并复核实现;没有运行记录时仍标为未验证。

发现与边界

遇到含糊的状态转移或保护规则时,用 CBR-## 编号,记录状态与请求、来源、触发条件、前置状态与计数、动作、后置状态、兜底、证据状态、影响、负责人角色、关闭条件和验证方法。只有在现有契约涉及并发或时间边界时,才补充对应检查。

这个 Skill 只复核熔断器行为。依赖故障测试: https://inaodeng.com/zh-cn/qaskills/dependency-failure-testing/;覆盖更广的调用方/依赖副作用矩阵;重试测试: https://inaodeng.com/zh-cn/qaskills/retry-testing/;检查与重试策略的交互;恢复测试: https://inaodeng.com/zh-cn/qaskills/recovery-testing/;覆盖更广的恢复结果。

不要推断失败阈值、恢复时长或生产行为。配置的状态和设计好的测试都不能证明熔断器已经在运行时完成转移。

安装与调用

安装这个独立 Skill:

npx skills add https://github.com/naodeng/awesome-qa-skills/tree/main/skills/zh --skill circuit-breaker-testing

调用 circuit-breaker-testing 时,提供状态策略、失败计数规则、探测限制、兜底契约和请求级证据。可从下面的脱敏输入开始:

请用 circuit-breaker-testing 复核这段脱敏的熔断事件轨迹。
契约:[失败计数、窗口、阈值、Open 时长、Half-open 探测额度/并发、兜底与状态转移]
轨迹:[请求 ID、时间戳、依赖结果、本地拒绝、探测结果和状态事件]
范围:[环境、版本、纳入或排除的调用]
请输出逐事件的前状态/计数/动作/后状态/兜底表和 CBR-## 候选发现,区分预期与已观察行为。不要自行补造阈值,也不要声称静态复核证明了运行结果。

常见问题

监控面板显示 Open,能证明普通调用已被本地拒绝吗? 不能。还要用同一时间窗内的请求身份、依赖调用记录和本地拒绝证据核对实际行为。

Skill 会在目标依赖上注入故障吗? 不会。它整理现有材料并准备隔离验证建议;真实故障注入不属于此 Skill 的执行范围。

源文件

使用前请阅读熔断器测试 Prompt: https://github.com/naodeng/awesome-qa-skills/tree/main/skills/zh/testing-types/circuit-breaker-testing/prompts/circuit-breaker-testing.md。其中定义了 CBR-## 发现契约,以及逐事件的前状态/计数/动作/后状态/兜底表。

分享