设计可恢复的故障转移验证,是要在配置层面证明两件事:节点失败后组能够改选其他候选;原候选再次满足健康检查条件时,仍能被判定为可用。验证应围绕官方健康检查与组成员字段,而不是增加无法对照文档的步骤。interval 如不为 0 则启用定时测试;max-failed-times 超过则强制检查。没有这两类检查,就无法说明失败可被发现、恢复可被重新测量。
适用条件:验证前必须能对上的字段
开展验证前确认:type 与 name 明确(特殊符号需引号);候选来源清楚,来自 proxies 或 include-all 系列,并理解 use 引入的集合不会被该组健康检查;url 已配置且 interval 不为 0,否则没有定时测试,无法观察恢复;理解 lazy 默认 true,验证过程中若该组未被选中,测试不会进行,恢复信号不会出现;清楚 expected-status,一旦限定状态码,恢复的定义就是再次返回期望状态。
组为空时的 empty-fallback 只接受 proxy 名称、默认 COMPATIBLE,不能用来验证「在多个策略组之间恢复」。判断依据是:被测对象在检查范围内、检查会再次发生、可用标准可复述。
具体操作:按失败可见、恢复可测、顺序可读来设计
第一步,固化候选顺序。记下 proxies 书写序;若 include-all、include-all-proxies 或 include-all-providers 开启,改为按名称排序理解。应用 filter、exclude-filter、exclude-type 后,列出过滤后的前两个候选。读 default-selected:为空或不存在则默认第一个节点。验证时应能指出失败时下一个预期候选是谁。
第二步,定义失败。使用该组 url 做健康检查;timeout 为毫秒级超时;若设置 expected-status,仅状态匹配才可用。关注该候选是否会因超时或状态不符被判不可用,不要去改 hidden、icon 等与可用性无关的字段。
第三步,定义检查何时发生。interval 决定定时测试周期;max-failed-times 默认 5,超过触发强制健康检查。可恢复验证必须包含「失败后仍会再测」的窗口:等到下一轮间隔,或等到失败次数触发强制检查。若保持懒惰且验证时未选中该组,窗口内不会有测试,验证无效。
第四步,定义恢复。恢复不是手工指定节点,而是下一次健康检查中该代理再次满足期望状态且未超时。因为检查范围不含 use 集合,验证对象必须出现在 proxies 中,否则恢复无法被该组测量。
第五步,定义空组边界。过滤后若组为空,应出现 empty-fallback 指向的 proxy,而不是继续在空列表上谈论故障转移恢复。
判断依据:计划中能写明被测对象在 proxies、间隔或强制检查会再次执行、可用标准是超时与状态码、过滤后的候选顺序仍可复述。缺任一项,验证既不能说明恢复,也不能复现。
失败时下一步
看不到失败切换或看不到恢复时,先检查对象是否只写在 use 中,导致该组健康检查未覆盖;再检查 interval 是否为 0,以及 lazy 是否让测试被跳过;接着检查 expected-status 是否过严,恢复时的状态码根本不匹配;然后检查是否忽略了失败次数触发的强制检查,只盯着间隔;最后检查空组是否已落入 empty-fallback。仍失败时,回到官方代理组字段逐项对照,停止扩大验证范围。