01、现场:一句“发送消息”背后的扯皮

业务同学在群里贴出一张截图:客户问“我的订单到哪了”,Agent回了句“抱歉,我暂时无法回答”。

接口返回只有一个失败码。业务找平台,平台说模型超时;模型团队说检索没召回;检索说知识库刚更新;工具网关说业务后端502。

一圈问下来,两小时过去了,没人能说清这次失败到底发生在哪一跳。技术越隐身,故障越像无主之物。

这不是某个团队的失职,而是抽象设计的代价被藏起来了。业务只看到一个接口,排障却要穿透五六个系统。

我的判断是:技术隐身的前提,是把复杂度内聚到可观测、可回滚的基础设施层。否则它只是把排障成本转移给了下游。


02、拆题:抽象该隐藏实现,不该隐藏证据

“发送消息”这个接口本身没错。它把多租户鉴权、意图识别、检索、工具调用、模型生成、消息回调串成一条链,业务方不必理解DAG怎么编排。

问题在于,很多平台只封装了成功路径。失败时,调用方拿到的是一个没有上下文的错误码,平台内部也没有一条能串起全链路的证据链。

可核事实是:分布式系统的故障定位依赖追踪、日志与指标的关联。

Elastic Observability 文档把 traces、logs、metrics 与 SLO 列为可观测性的基本组成;

AWS 可靠性支柱也强调变更管理与故障恢复流程。

这两份资料说的是通用工程原则,不是针对Agent平台的结论。但放到Agent场景,链路更长、参与者更多,原则只会更刚需。


03、原理:一次失败要能回答五个问题

部署边界图

一条回答失败,平台至少要能回答:哪个租户、哪次请求、走了哪条路径、每个环节耗时多少、最终归因给谁。

这需要入口统一生成 trace_id,并在检索、模型、MCP工具、业务后端、消息回调之间透传。结构化日志记录关键业务事件,而不是把整段用户文本原样落盘。

敏感内容要最小化记录:记录文本哈希、长度、脱敏片段和策略版本即可。排查需要的是关联能力,不是把客户原话复制到日志系统。

MCP 规范把工具描述和注解视为不可信输入,要求宿主在调用工具前获得用户授权。这提醒我们:工具调用的证据链里,必须包含授权与策略版本。


04、取舍:自动重试和自动回滚不是免费的

重试看起来是提高可用性的默认动作,但它可能放大故障。下游已经过载时,无退避的重试会把流量再翻几倍。

以给客户重复发送邮件为例:第一次调用其实成功了,只是响应超时,平台重试后客户收到两封。副作用动作必须有幂等键。

工程上通常组合使用:幂等键去重、指数退避加抖动、限流与熔断。涉及支付、通知、工单创建这类有副作用的动作,还要设计补偿与人工审批。

回滚同样有边界。Kubernetes Deployment 文档说明,回滚针对的是 Deployment 修订版本,也就是 Pod 模板。它不会自动回滚配置中心、Prompt、知识库索引和工作流定义。

只回滚容器镜像,很可能把“代码旧了、Prompt还是新的、索引还是脏的”这种混合状态留给线上。版本回滚必须覆盖这五类制品。


05、架构:把证据链做进入口

跨角色泳道图

我倾向的落地顺序是:统一入口 → Trace/日志/指标 → 错误归因 → 熔断限流与幂等 → 灰度与多版本回滚 → 责任闭环。

统一入口负责生成请求ID、绑定租户与策略版本、写入调用链起点。后续每一跳都继承这个ID,不允许自造。

错误归因要落到枚举:检索未命中、模型超时、工具超时、业务后端错误、回调失败、策略拒绝。每个枚举对应明确的负责团队和恢复预案。

灰度与回滚要按制品维度管理。代码、配置、Prompt、索引、工作流定义各自有版本号和回滚开关,发布记录能关联到具体请求。


06、实战:用SLO和演练证明隐身有价值

工具调用时序图

平台需要一组能对外承诺的SLO:成功任务率、P95时延、错误预算、MTTR、变更失败率、人工处理量。

这些指标不是给管理层看的装饰。成功任务率下降时,要能下钻到具体路径;MTTR变长时,要能看出卡在归因还是卡在恢复。

演练要按调用路径设计:数据库故障、模型不可用、工具超时、知识版本污染。每次演练记录发现时间、定位时间、恢复时间和责任团队。

验证方式很朴素:随机抽一条失败请求,要求值班同学在约定时间内说出它经过了哪些环节、归因是什么、对应哪条恢复预案。做不到,就说明证据链没做进去。


07、复盘:指标要能证伪“隐身”

我关注的验证指标有五个:SLO达成率、MTTR、变更失败率、重复副作用次数、定位问题耗时。

重复副作用次数尤其值得盯。它直接反映幂等设计是否有效,也是业务方最能感知的伤害。

变更失败率反映灰度与回滚能力。如果每次发布都靠人盯,回滚只回镜像,这个数字不会好看。

定位问题耗时是排障成本的直接度量。它下降,才说明抽象真的把复杂度接住了,而不是甩给了别人。


08、洞见:隐身的价值在于可恢复

好的基础设施不是没有复杂度,而是把复杂度变成系统可以看见、控制、恢复的能力。

对业务方来说,隐身意味着不用理解DAG和MCP;对平台来说,隐身意味着必须自己扛住证据链、副作用和版本管理。

商业价值也在这里:客户不会因为接口简单而原谅重复扣款,也不会因为架构先进而接受两小时无人认领的故障。

需要说明的是,上述SLO阈值和演练频率要结合业务体量设定,本文不给出通用数字,也不把任何单一实践当成行业结论。


09、小结:先让故障有主

技术越隐身,越要在内部把责任显性化。入口统一、证据可查、副作用可控、版本可回滚,这四件事做不到,隐身就是甩锅。

一条反常识的行动建议:先别急着优化回答质量,先让每一条失败请求都能自动指向一个负责人和一条恢复预案。

讨论问题:你们平台的“发送消息”接口,失败时调用方拿到的除了错误码,还有什么?

延伸阅读:可查阅 Elastic 官方文档 Observability 的 Get started 章节,了解 traces、logs、metrics 与 SLO 的组织方式。

延伸阅读:可查阅 AWS Well-Architected Framework 可靠性支柱的 Introduction 与变更管理相关章节,理解恢复流程的设计原则。

延伸阅读:可查阅 Kubernetes 官方文档 Deployments 的 Updating a Deployment 与 Rollback 章节,确认回滚的作用边界。

延伸阅读:可查阅 Model Context Protocol 规范的安全与信任章节,理解工具调用授权与不可信输入的约束。

Logo

更多推荐