Agent 应用开发会员账号
知识目录选择核心方向与细分内容
知识单元 13高级原理约 18 分钟

理解 → 实现 → 排错 → 取舍

连接恢复、消息恢复与业务核验

考察 stdio、Streamable HTTP、会话恢复与业务幂等的区别。

MCPStreamable HTTP断线恢复

知识内容核对 2026-10-03 · 原题来源核对 2026-10-02

这个知识点,你想学到哪一步?

按当前基础选择起点,也可以依次深入。遇到不熟悉的概念,先回到核心原理;完成后用知识练习检查理解。

先理解

刚接触这个知识点

补齐先备概念,读原理与反例,再用自己的话解释为什么。

从核心原理开始 →

再实现

准备把原理写进代码

理解实现步骤与边界,完成小任务,对照验收要求检查结果。

阅读实现与取舍 →

会排错

需要处理故障与条件变化

沿连续追问定位失效前提,再比较迁移案例,说明方案应如何调整。

沿问题继续深入 →

能取舍

需要设计或评审方案

结合工程推演与资深自评标准,解释方案的适用条件、代价和替代选择。

分析工程场景 →
知识单元目录

LEARN · PRACTICE · REFLECT

知识学习与个人记录

我的笔记与复习 ↗

先沿着原理、问答和迁移案例阅读。需要检查理解时,再切换巩固练习或展开个人记录。

作答与个人记录

每次修改后的提交会保留为独立历史。掌握程度由你对照标准自评。

核心知识 · 连接恢复、消息恢复与业务核验

先理解核心原理

先备概念:JSON-RPC 请求匹配、SSE 游标、业务幂等

传输断开表示消息通道中断,不表示业务动作取消或未发生。请求 ID 匹配响应,事件 ID 定位消息,业务操作 ID 去重副作用;三种身份不能互相替代。

用三条时间线排查

网络连接有建立与断开,协议请求有发送与响应,业务动作有提交与生效。连接先断而动作后完成完全可能。若把连接状态当业务状态,新连接一建立就重发,会重复外部写操作。

恢复消息不是重新执行

固定 MCP 2025-11-25 修订中,服务器可提供 SSE 事件重放,客户端以 Last-Event-ID 请求续流;这是可选能力。会话失效时需要重新初始化,原会话 ID 不能无限继续用。取回迟到响应之后仍要按调用关联处理,而非把重复事件执行成第二个动作。

业务标识必须跨连接保存

本地持久化操作 ID、参数摘要和未知状态。服务器支持幂等则复用同一业务键,没有消息恢复时仍可通过业务查询核验。HTTP 的重试或 SDK 自动重连不提供外部 exactly-once;stdio 的 stdout 则必须只承载协议,日志污染也会导致通信失败。

用一个问题检查理解

MCP 连接断了,重连后能直接重新执行上一次工具吗?

不能把断连等同于工具未执行。先区分传输恢复、协议会话恢复和业务操作核对:支持事件恢复时按游标取回消息,会话失效时重新初始化,外部写操作则凭业务操作 ID 查询回执。新连接或新的 JSON-RPC ID 都不自动保证幂等。重试条件取决于工具语义和下游幂等支持,而不只是 HTTP 状态。

实现与取舍

三种标识不要混用

JSON-RPC 请求 ID 用于匹配请求与响应,会话 ID 用于协议会话,业务 operation_id 用于识别一次逻辑动作。三者生命周期不同。客户端进程重启可能生成新协议 ID,但同一笔待核对操作应保留业务 ID。stdio 下还要防止日志写到 stdout 污染协议消息,日志应走独立通道。

断连后的恢复顺序

先将本地操作标为结果未知,暂停同一业务动作的重复提交。若服务端提供流恢复能力,则从已确认事件游标恢复;会话被服务端终止时按协商流程建立新会话。恢复消息并不等于重新执行工具,客户端应去重已消费事件。若无法恢复响应,再通过业务查询工具或操作账本核对结果。

什么时候允许重试

只读查询可按预算重试;写操作只有在下游支持相同幂等键,或已可靠确认未执行时才可重试。若既无幂等机制也无法查询,就进入人工核对或明确的未知状态,不能承诺恰好执行一次。TCP 连接关闭、浏览器退出和请求取消也不是同一个业务信号。

验证协议和业务两层

在服务端提交动作后、响应送达前主动断开连接,再连接并观察是否出现重复副作用。还要测试重复事件、游标过期、会话失效和进程重启。规范中的可选恢复能力需要检查实际服务端支持,不能把某个 SDK 的实现当成所有 MCP 服务都具有的能力。

工程推演

场景
面试假设:MCP 发布工具已完成发布,但响应流在网络抖动中丢失。
设计决策
保留 operation_id,先恢复消息或查询发布回执。
验证目标
重连不产生第二次发布,无法核对时保持未知状态。
适用边界
没有下游幂等或查询接口时无法仅靠 MCP 承诺 exactly-once。

连续追问与解答

沿着问题的前提和约束继续向下读。先理解参考解答,再尝试收起答案,用自己的话解释因果和取舍。

举一反三:条件变了,怎样推导?

先找出改变的条件,再判断原方案中哪些前提仍成立。下面的案例是教学推演,便于将原理迁移到新问题。

连接未断但请求超时

改变的条件:断连换成客户端等待预算耗尽

延伸问题:业务处理可以当失败重做吗?

推导与参考解答

不能。等待超时与断连同样只说明本地未取到结果。查询原操作,按幂等策略继续;客户端停止等待不必等同取消远端。可取消工具需要明确取消请求及回执,已提交写入仍核验。

保持不变的原理:通信和等待状态不能替代业务结果。

会话被服务器终止

改变的条件:重连可以续会话变成会话已失效

延伸问题:旧操作记录要随会话丢掉吗?

推导与参考解答

不丢。按协议建立新会话并重新发现能力,同时保存旧业务操作的查询依据。会话状态可能消失,但支付、发布等外部事实仍存在;新会话只提供新的通道。确认工具版本与权限后再处理原未知动作。

保持不变的原理:业务生命周期可能长于协议会话,操作账本必须独立。

易错点

  • 断线就无条件重发
  • 把 JSON-RPC ID 当业务幂等键
  • 把关闭连接当取消动作

参考资料

依据公开技术资料设计;参考资料支持技术机制,场景与评分标准为本站设计,不代表某公司面试原题。 新增问答与迁移案例用于原理讲解,来源核查与案例运行验证分别记录。

检查自己理解到哪一步

读完后可以对照这些标准解释原理、边界和取舍。掌握程度由你自评;需要进一步验证时,再完成下方小任务。

基础达标
知道断连可能发生在动作已提交之后。
中高级信号
能拆解流恢复、会话重建与回执核对。
资深信号
用故障注入验证重复事件和无法核对的保守终态。

动手验证 按需完成 · 建议 15 分钟

画出提交已成功但响应丢失的时序,列出重连后的三个分支。

展开验收要求与检查点
  • 已成功动作不被盲目重复
  • 无法核对时返回未知
  • 事件去重与业务幂等分开

重点检查

  • 区分请求、会话、业务 ID
  • 处理断连后的未知结果
  • 不把可选恢复能力当强保证