在现代分布式系统中,自治代理常在编排器的调度下执行受限的软件任务。编排器通常借助服务网格的三大可靠性原语:重试(retry)、超时(timeout)以及错误率断路(circuit breaking),来实现任务的重试、恢复和预算控制。
本文对一个生产环境的代理软件交付平台进行故障研究,累计 147 起编号事件,覆盖 81 次运行。每起事件均记录了成本,并在大多数情况下提供了可复现的突变证明。研究发现,支撑上述三大原语的假设在实际中普遍被违背,并量化了其后果:
- 连续 54 次成功的工具调用未触发任何错误率断路器;
- 进度信号被硬编码为常量,导致在第三次修复轮时误触断路,使一次运行的六个组件降至三 个;
- 单次委托的六次调用累计产生 21 条事件,使本应幂等的组件无法恢复;
- 一次错误路由导致五个组件被唤醒,实际故障仅涉及两个组件,三 个旁观者的代码被错误回滚;
- 12 起事件中,强制层阻塞了正确的工作,其中最昂贵的一例消耗了 107 次代理轮次却未产生任何写入。
进一步分析揭示了一个跨域根因及其对偶:
身份充分性:在五个子系统中,身份识别未能区分不同实体,导致系统自信地给出错误答案,其中两例独立推导出相同的纠正规则。
证据充分性:可靠性决策只能基于能够推动行动的证据,该证据必须可归因于其测量对象,并在相同条件下保持确定性。
基于上述发现,本文提出了七个可靠性原语,其执行单元从“消息”转移到“委托”。这些原语包括:身份校验、证据评估、委托级重试、委托级超时、委托级错误率监控、委托级幂等保证以及委托级回滚控制。文中还概述了受控评估的设计方向,但未给出完整实现。
博主点评:本文通过大规模实证揭示了服务网格在非幂等代理场景下的盲点,提出的委托级原语为未来可靠性框架提供了有价值的思路,值得在实际系统中进一步验证与迭代。