最危险的失败是"没有报错"
有一类失败最难发现 ✗:系统"成功"返回了 ✔,但结果是错的或空的 ✔ ——
没有异常、没有报警、指标也正常 ✔(因为接口确实 200 ✔)。
这类"沉默失败"要靠专门的守卫来抓 ✔。
一、六种沉默失败
① 返回空结果但状态成功(检索没命中,却当"没有相关内容"返回)
② 答案格式对但内容空洞("这取决于具体情况")
③ 静默降级(走兜底但未标注,见降级链那篇)
④ 静默截断(输入/输出被切但没有说明)
⑤ 默认值兜底(字段缺失时用默认值填上,且不告知)
⑥ 部分成功(10 条里成功 3 条,只报成功)
第 ① 与 ⑤ 项最常见 ✗→✔。
二、五个守卫
| 守卫 | 抓什么 |
|---|---|
| 空结果率(按功能) | ①(突然升高说明检索或解析坏了 ✔) |
| 答案长度下限 | ②(低于阈值触发复核 ✔) |
| 降级标注率 | ③(降级了就必须有标注 ✔) |
| 截断计数 | ④(截断必须计数并呈现 ✔) |
| 默认值使用率 | ⑤(按字段统计 ✔ —— 高说明上游缺失 ✔) |
| 部分成功明细 | ⑥(必须报"成功 3 / 失败 7" ✔) |
要点:每个守卫都要有阈值与告警 ✗ ✔,否则等于没有 ✔。
三、为什么"指标正常"也会出事
因为常规指标看的是错误率(异常/失败 ✔),
而沉默失败不产生错误 ✔ —— 它产生的是"看起来正常的坏结果" ✔。
所以必须监控"结果质量的下限",而不仅是错误率 ✔:
- 空结果率 ✔;
- 平均输出长度 ✔(骤降是好信号 ✔);
- 用户追问率 ✔(答得不好 → 用户会追问 ✔ —— 这是最灵敏的间接信号 ✔)。
四、三个反模式
- 只监控 5xx ✗;
- 把"没结果"当成正常业务 ✗(没结果可能是故障 ✔);
- 部分成功只报成功 ✗(最容易被用户投诉的一类 ✔)。
五、一条判据
让系统"静默返回空结果" ✔,多久会被发现 ✔?
如果只能靠用户投诉才发现,说明沉默失败没有守卫 ✗。