研究报告 · 约 31,744 字 · 预计推送 4 部分

WebSocket、SSE 与长轮询:实时 Agent UI 的连接管理、断线重连与背压 未开始

目录

题记与说明


TL;DR

三十年三次范式转移:拉→推(Comet 长轮询)、推→专用协议(WebSocket)、回归 HTTP 语义(SSE 复兴+服务端状态恢复)。2026-11 的结论:SSE 已赢得实时 Agent UI 默认传输位——所对照的主流 LLM API(OpenAI、Anthropic 等)的 token 流一律走 SSE(其余厂商未逐一复核,见 2.3.1);断线重连的胜负手不在传输层而在会话层——裸传输"三不保证"(投递、连续性、可观测性),差异化在 Socket.IO 状态恢复、Centrifugo 历史恢复、MCP Last-Event-ID 重放;背压是全行业盲区,Agent UI 靠应用层(abort、节流、token 预算)绕开。选型:SSE+POST 起步;高频双向用 WebSocket 但勿裸写(交给框架);恢复是硬需求时先问"恢复窗口多长、恢复范围多大、状态存哪"。三十年绕了一圈:把 HTTP 拧出汁→造新协议→回到 HTTP、把状态放回服务端。


一、纵轴:发展脉络(1995–2026)

1.1 前史(1995–2004):HTTP 是"拉"协议,实时是奢侈品

HTTP/1.0 时代每次请求都要建 TCP 连接,浏览器没有任何"被动接收"的 API。早期工程师用过各种奇怪的办法:

这一阶段显形了贯穿三十年的根本矛盾:延迟与服务器连接成本不可兼得——轮询间隔短了服务器扛不住,间隔长了"实时"名不副实。

1.2 Comet 纪元(2005–2007):长轮询的黄金时代

留下的工程遗产(横轴上今天仍然有效):长轮询的心跳保活、代理超时规避、重连后靠序号补消息——这正是后来所有断线重连机制的雏形。同时 Apache"一连接一线程"模型在数千个挂起连接下崩溃,倒逼 nginx、Jetty Continuations 等事件驱动方案兴起——实时需求第一次重塑了服务器架构。

1.3 WebSocket 标准化(2008–2011):破冰、断裂与 RFC 6455

1.4 并行的 SSE 与"重连工程"的成熟(2009–2015)

WebSocket 高歌猛进的同时,一条更保守的路线在标准化中成型:

驱动因素:移动互联网普及——NAT 超时、App 切后台、基站切换让断线成为常态;企业代理与负载均衡器让"纯 WebSocket"不可靠;多节点部署要求会话粘性。连接管理从协议问题变成了分布式系统问题。

1.5 云与企业采纳(2015–2019):HTTP/2 与回退矩阵定型

1.6 下一代传输与背压补课(2019–2024)

1.7 Agent UI 诞生(2022-11–2024):SSE 复兴与长轮询"还魂"

本轮范式转移的驱动因素:① TTFT(首 token 延迟)物理不可消除——流式是唯一能改善感知性能的手段,且"看着它在想"本身就是产品价值;② 半双工足够——对话 UI 本质是"一次请求、流式回答",SSE 完美匹配,且过一切代理、可被 CDN/网关无状态扩容,连接不再珍贵;③ 状态外移——上下文与任务状态放在服务端,连接可以随时死掉。三条共同宣告:实时 Agent UI 的主战场从"保住连接"转移到"保住状态流"。

1.8 协议收敛与"可恢复流"成为主战场(2025–2026)

1.9 三条子线的三十年小结

子问题Comet 时代(2005–07)连接库时代(2008–2021)Agent 时代(2022–26)
连接管理应用自己挂起 XHR、防代理超时传输协商 + 心跳 + 指数退避(Engine.IO);云托管连接(API Gateway、Pusher)无状态 SSE 网关 + 服务端会话(MCP Mcp-Session-Id)
断线重连应用代码里记序号、补拉消息浏览器承诺(EventSource + Last-Event-ID)→ 库的状态恢复(Socket.IO 4.6,2023-02)服务端状态恢复协议(previous_response_id、AI SDK resumable streams、MCP 事件重放)
背压无(TCP 流控不可见)服务端 Reactive Streams;浏览器侧直到 WebSocketStream(2024-04)才补齐应用层 token 预算 + 渲染节流;QUIC 流级流控;SSE 背压仍是缺位项

一句话收束:实时 Web 的三十年,是从"把 HTTP 拧出汁来"(Comet),到"造一个新协议"(WebSocket),再到"回到 HTTP、把状态放回服务端"(SSE + 可恢复流)。断线重连的进化史,本质是一部状态归属权的迁移史:状态先在客户端连接库里,后被浏览器内置,最终落在服务端的任务状态机上——而这正是 Agent 这一"长任务、有状态"的新负载对传输层提出的最深要求。


二、横轴:横向对比(2026-11 截面)

2.1 对比对象的界定:五层模型

"实时 Agent UI"不是单一技术点,而是一条分层栈。横向对比必须先分层,否则会把"协议 vs 框架 vs 平台"混为一谈:

层成员解决什么
L1 传输层长轮询、SSE、WebSocket、WebTransport字节如何流动
L2 编码/会话协议层SSE 事件格式(event:/data:/id:)、MCP Streamable HTTP、AI SDK UI Message Stream v1、AG-UI字节之上如何组织事件与会话
L3 框架层Socket.IO、SignalR、Centrifugo重连、恢复、房间、fallback 的工程化封装
L4 托管平台层Ably、Pusher、Firebase Realtime、Vercel 实时能力把 L1–L3 整体外包为服务
L5 Agent 语义层工具调用审批、打断/取消、human-in-the-loop、跨设备续会话Agent UI 特有的业务语义

本课题三个关键词——连接管理、断线重连、背压——分别散落在 L1/L3/L4 层。需要说明分层纪律如何落实到下文两张表:L2 协议随其最常见载体对比——MCP Streamable HTTP 随其 HTTP/SSE 传输载体进入 2.2 主表(表题 L1–L2),AI SDK UI Message Stream 与 AG-UI 随框架/平台进入 2.4 表(表题 L2–L5);两表括注按实际所含层次标注。

2.2 主对比表(L1–L2)

维度长轮询SSE(EventSource)WebSocket(裸)WebTransportMCP Streamable HTTP(2025-03-26 起)
通信方向请求-响应循环模拟推送单向:服务器→客户端全双工多流:单向/双向 + 不可靠数据报POST 上行 + 可选 GET SSE 流,近双向
协议底座普通 HTTP 请求挂起HTTP/1.1、2、3 均可,text/event-streamRFC 6455,HTTP Upgrade 后独立 TCP 帧协议HTTP/3 + QUIC普通 HTTP(POST/GET)+ 可选 SSE 编码
原生断线重连天然"重连"=下一个请求有:浏览器自动重连 + Last-Event-ID无:完全自建无跨流会话语义,自建有:GET 流带 Last-Event-ID 可续
断线消息恢复无原生;应用记序号可补(见 1.2 遗产)无原生重放:浏览器自动携带 Last-Event-ID,重放需应用层配合(给事件编号且保留缓冲)无原生;需应用层自建无原生(需应用层)有协议内建重放语义:服务器需保留事件供重放
背压由请求节奏隐式限速仅 TCP/HTTP 层隐式流控经典 API 无背压(bufferedAmount 只能事后观测);WebSocketStream(2024)补课但生态未普及流级背压是设计目标复用 HTTP 流控;常驻流为可选
代理/防火墙友好度最好很好(纯 HTTP 响应),但需关代理缓冲差:深度包检测防火墙可能整体阻断最差:需 HTTP/3 端到端 + 代理支持好(普通 HTTP 请求即可工作)
二进制任意 MIME仅 UTF-8 文本文本 + 二进制二进制原生JSON 为主(SSE 编码也是文本)
基础设施成本每消息一次请求,header 开销大低;HTTP/1.1 下每域 6 连接上限,HTTP/2 解除中:需 Upgrade 支持、sticky 路由、长连接维护高:HTTP/3 全链路改造最低:无长连接也能工作
2026-11 成熟度遗留/兜底主流上升期("2025 是 SSE 之年")最成熟、全栈支持浏览器 Baseline(2026-03),服务端生态未跟上MCP 远程传输的官方推荐
SSE/长轮询/WebSocket 对比事实来自 Ably 官方博客(WebSockets vs SSE,横轴章已抓取原文核对)与 2025 年多篇对比文;MCP 行来自官方规范;WebTransport 行来自 websocket.org、Ably 等检索。

2.3 逐维度说明

2.3.1 通信模型与协议底座

小结:Agent UI 中,上行(用户输入、确认、取消)是低频小消息,下行(token 流、工具事件、进度)是高频主负荷。这个不对称性正是 SSE+POST 组合能以极低成本覆盖大多数 Agent 场景的结构性原因。

2.3.2 连接管理与断线重连

小结:重连能力的真实排序不是"有没有自动重连",而是三个工程参数——恢复窗口多长(2 分钟 vs 可配置保留期)、恢复范围多大(补发事件 vs 恢复完整会话状态)、恢复依赖什么基础设施(内存 vs Redis Streams/MongoDB vs 服务端历史)。

2.3.3 消息恢复与可靠性:Ably 的"三不保证"

Ably 的对比文(已抓取原文)给出了本维度最重要的框架性结论:无论选哪个裸传输,以下三项都不被保证——

  1. 投递(Delivery):不保证消息到达,也不告知失败。WebSocket 在网络中断期间发出的消息可能静默丢失;SSE 中断留下的是无人知晓的数据空洞。
  2. 连续性(Continuity):刷新页面或换设备,会话状态从零开始。没有任何传输保证跨设备/跨刷新的会话存活。
  3. 可观测性(Observability):不会在用户之前发现问题,排障基本靠事后日志。

因此 Agent UI 的"断线续看历史"必须靠会话层方案补齐:SSE 事件编号 + 服务端事件缓冲、Socket.IO 的 offset 补发、Centrifugo 的 history recovery、或应用层把 agent 运行状态落库、重连后用"查询"代替"补发"。MCP 生态选择的是最后一种思路的变体——Streamable HTTP 让"无长连接也能工作",流断了重放,重放不可得就重新 GET。

2.3.4 背压与流控:全行业盲区

这是三种基础传输共同的、2026 年仍未被主流框架解决好的盲区:

Agent UI 语境的调和说明:纵轴章强调"服务端一分钟产完的 agent 步骤,客户端可能还要渲染三十秒,且 EventSource 无法感知缓冲积压";横轴章观察到"token 流的生产速度即 LLM 生成速度,客户端消化速度远快于生成速度"。两者不矛盾,是两个不同层面的背压:token 级流受生成速度天然限速,渲染不是瓶颈;事件级/任务级流(高频工具事件、日志、多 agent 扇出、服务端已产完而客户端未播完的长任务)才是真正的积压风险——而 EventSource 没有标准反压信号,使这种积压不可见。目前主流应对不是传输层背压,而是应用层手段:abort(AI SDK 有专门的 abort chunk 语义,已抓取原文)、分批发送、渲染节流与打字机式平滑输出。

2.3.5 代理、防火墙与基础设施成本

2.3.6 生态成熟度(2026-11 截面)

2.4 框架层与协议层横向对比(L2–L5)

维度Socket.IOSignalRCentrifugoVercel AI SDK(UI Message Stream v1)AG-UI
定位JS 通用实时框架.NET 官方实时框架Go 多协议实时服务器Agent UI 流协议 + SDKAgent-用户交互开放协议
默认传输Engine.IO:HTTP 轮询起步,可升级 WebSocket协商:WebSocket→SSE→长轮询WebSocket 为主,提供 SSE/HTTP-stream 等回退SSE(x-vercel-ai-ui-message-stream: v1;协议选 SSE 的理由即含 ping 保活与重连)HTTP/SSE/webhook
自动重连有(退避可配)有有依赖 SSE 层,SDK 文档称有 reconnect 能力(细节未文档化)协议层未定死,随实现
断线恢复connection state recovery:offset 补发 + rooms/data 恢复,窗口官方示例 2 分钟重连策略内建;.NET 7+ 增强基于服务端历史 + offset/epoch 的自动补发,窗口可配无传输级恢复(重连后由服务端重放/续传流);tool-input-start 携带可选 inputEncoding,且编码信息随持久化的 input-streaming 工具部件保留,保证续播后输入解析不乱(流协议文档已核对)依赖后端(LangGraph checkpoint 等)
背压无内置,需手动 ack(issue #4435)有限,依赖底层传输服务端限流/队列上限/恢复窗口应用层 abort chunk;无传输级背压未定
多机扩展Redis Streams/MongoDB 适配器支持恢复;Redis PUB/SUB 不支持Azure SignalR Service原生水平扩展设计Serverless 函数模型(Vercel WS 受限)随后端
典型用户通用 Web 实时.NET 企业自建 fan-out 中小型团队Next.js/React Agent UICopilotKit 系 Agent 前端

读表要点:Socket.IO 与 Centrifugo 代表两种恢复哲学——前者恢复"这个连接的会话状态"(rooms/data/offset,分钟级窗口),后者恢复"channel 的消息流"(服务端历史 + 流位置,窗口可配到更长);AI SDK 代表第三种——不做传输级恢复,靠 SSE 编码语义 + 服务端持久化让流"可续"(已抓取原文)。

2.5 Agent UI 场景适配矩阵

典型场景推荐理由与依据
Token 流式输出(LLM 回答逐字上屏)SSE所对照的主流 LLM API(OpenAI、Anthropic 等)原生 SSE(见 2.3.1),网关透传即可;OpenAI data:[DONE]、Anthropic 类型化 event: 行
工具调用审批(human-in-the-loop)SSE + POSTAI SDK 以 tool-approval-request/tool-approval-response chunk 下行审批、上行确认,无需双工长连接(已抓取原文)
中途打断/取消/重定向SSE + POST abort;高要求场景 WebSocketAbly 明确指出纯 SSE 无法承载"停止按钮"类中途信号,需叠加 POST 或转 WebSocket(已抓取原文)
高频双向(语音 agent、协作编辑、实时画布)WebSocket(未来 WebTransport)双工 + 低延迟 + 二进制;SSE 的文本单向模型不适配
断线续读(用户临时断网回来)框架/平台恢复机制或自建事件缓冲裸传输不保证投递与恢复(Ably 三不保证)
刷新页面/换设备续会话应用层 checkpoint(agent 运行状态落库 + 重放)无任何传输保证 continuity;这是会话设计问题而非传输问题
关标签页/移动端的后台 agent 完成通知Web Push / 托管通知长连接只在页面存活期有效
企业网络/强合规环境SSE 优先WebSocket 可能被深度包检测防火墙整体阻断(Ably)
大规模扇出(10 万+ 连接)Centrifugo / 托管平台 + WebSocket连接管理、恢复窗口、背压控制已被产品化
多模态低延迟流(音视频 + 控制信令)WebTransport 试点无队头阻塞 + 数据报 + 流级背压;需自担生态风险

三、交叉洞察

3.1 两轴结合说明了什么

洞察一:断线重连三十年史 = 状态归属权迁移史;横轴上的当代形态是"评估实时方案的三问"。
纵轴显示,重连责任经历四次迁移:应用代码记序号(Comet)→ 浏览器承诺(EventSource + Last-Event-ID,2009)→ 连接库的状态恢复(Socket.IO 4.6,2023-02)→ 服务端状态恢复协议(previous_response_id、resumable streams、MCP 事件重放,2025–2026)。横轴印证了迁移的终点:今天所有主流方案——Socket.IO 的 offset 补发、Centrifugo 的 history recovery、MCP 的 Last-Event-ID 重放、AI SDK 的流恢复——本质是同一思想(流位置 + 服务端保留 + 重连续传)在不同抽象层的实现,且没有谁把状态放在传输层。纵轴的"终局"与横轴的"格局"互为证明:评估任何实时方案,该问的不是"支持 WebSocket 吗",而是恢复窗口多长、恢复范围多大、状态存在哪。

洞察二:负载变迁每次都重写"哪个协议更强"的答案——选型由场景不对称性决定,而非协议优劣。
三十年里同样的争议(延迟 vs 成本 vs 可靠性)换了三种负载重演了三次:社交信息流时代长轮询胜出(Comet)、移动 IM 时代 WebSocket 胜出(双工+二进制+移动网络)、token 流时代 SSE 胜出(所对照的主流 LLM API 用脚投票,Simon Willison)。每一次,胜者都不是"技术上最强"的协议,而是与当期负载的不对称性(上行低频/下行高频、文本/二进制、单向/双向)最匹配的协议。Agent UI 的不对称性是:上行是低频小消息(输入、确认、取消),下行是高频主负荷(token 流、工具事件)——这决定了 SSE+POST 的结构性优势,也决定了语音 agent 必然回到 WebSocket/WebTransport。

洞察三:两章关于背压的"矛盾"是 API 分层的真实写照——背压每次栈上移一层就丢失一次,再由更高层补课。
纵轴说"WebSocketStream(2024)给浏览器 WebSocket 补上了背压",横轴说"浏览器 WebSocket API 无背压(MDN)"——两者都对,只是对象分别是 2024 年的新 API 与 2011 年定型的经典 API(完整调和见 1.6 与 2.3.4,此处不重复);Agent 场景 token 级 vs 事件级/任务级两层背压之分同理(见 2.3.4)。把这个分歧展开,是一条贯穿三十年的规律:TCP 有流控 → Comet 把它藏进了 HTTP 挂起 → 经典浏览器 API 丢失它 → WebSocketStream/WebTransport 在新 API 里补回 → Agent 时代又在应用层重建它(token 预算、渲染节流、abort 语义)。收束成一句话:EventSource 没有标准反压信号、事件级积压不可见——这是 2026 年 SSE 体系最明确的未完成项。

洞察四:"常驻连接"的理想三次都没赢到底——部署友好性一再击败连接姿态。
Comet 的常驻挂起被 WebSocket 的常驻双工取代;WebSocket 的常驻双工被企业防火墙、无服务器函数模型、多实例扩容不断削弱(LB 空闲超时、sticky 路由、Vercel 原生 WebSocket 的函数时长限制——见 2.3.6);2025-03-26 MCP 干脆弃用常驻 SSE 端点,改用单端点 Streamable HTTP(动机解析)——弃用的是"SSE 端点"而非"SSE 编码"。三次范式转移中,"常驻连接"每次都是更优雅的姿态,每次都输给了"没有长连接也能正确工作"的部署现实。把协议先设计成无长连接可正确工作、再把流作为性能增强,是三十年沉淀下来的设计铁律,也是 Streamable HTTP 被选为 MCP 标准的根本原因。

洞察五:协议成功靠生态兼容而非技术优越——2010 年的断裂与 2026 年的 Baseline 互为镜像。
WebSocket 在 2010 年因 draft-76 代理缓存投毒遭遇"断裂一周",RFC 6455 用帧掩码换回中间盒的信任才得以存活;三十年后的 WebTransport 技术上最全面(多流、数据报、流级背压),2026-03 达到浏览器 Baseline,但瓶颈换位到 nginx/负载均衡/服务端框架——"最大的摩擦点在后端而非浏览器"。两个事件互为镜像:传输协议的胜负手从来不在协议本身,而在它与部署生态(代理、防火墙、LB、函数平台)的兼容成本。参照 WebSocket 从 2011 规范到成为默认花了约十年,短期内 WebTransport 不会改变 Agent UI 格局;它最可能的突破口是语音/多模态 agent(数据报 + 无队头阻塞 + 流级背压)。

洞察六:长轮询的四次身份变化,说明"淘汰一种技术容易,淘汰它的思想很难"。
长轮询的一生:Comet 时代的主角(2005–2007)→ 连接库时代的回退兜底(Engine.IO 起步传输、SignalR 协商最后一极)→ Agent 时代的"还魂"(2023-11 Assistants API v1 靠轮询 retrieve run 获取分钟级任务状态——长任务下轮询反而最朴素可靠)→ Responses API(2025-03)以服务端状态 + 流式事件终结轮询,Assistants API 于 2026-08-26 关停。它退场了,但两个设计遗产被正式继承:"无长连接也能工作"的降级思想(Streamable HTTP 的核心主张)与"以请求节奏实现天然限速"(某种意义上是背压的最朴素解)。给选型者的启示:不要按"技术是否过时"排除选项,要按"负载需要什么思想"重新组合它们。

洞察七(总收束):Agent UI 的主战场从"保住连接"转移到"保住状态流",两轴在此汇合。
纵轴的三条驱动因素(TTFT 不可消除、半双工足够、状态外移)解释了为什么转移发生;横轴的 Ably"三不保证"解释了转移后竞争在哪里——裸传输层已无差异化空间,胜负全在会话层(恢复窗口、恢复范围、状态存哪)与语义层(审批、打断、跨设备续会话)。三十年前的问题"浏览器如何第一时间拿到新数据",在 Agent 时代的答案变成了:"连接随时可以死,只要状态流能续上。"

3.2 对用户的判断与建议

默认路径(多数 Agent UI 项目从这里开始):

  1. 下行以 LLM token 流为主 → SSE(HTTP/2 部署)+ 普通 POST 上行。给每个事件编号并实现 Last-Event-ID 重放端点(SSE 的自动重连只有在此前提下才"免费");或直接采用 AI SDK UI Message Stream v1 / MCP Streamable HTTP 这类现成会话协议,别自造编码。
  2. 断线恢复是硬需求(付费用户、长任务 agent)→ 先回答三问:恢复窗口(分钟级够吗?Socket.IO 官方示例 2 分钟,Centrifugo 可配保留期)、恢复范围(补发事件还是恢复完整会话状态)、恢复依赖(内存 / Redis Streams / MongoDB / 服务端历史)。长任务 agent 另加应用层 checkpoint:agent 运行状态落库,重连后用"查询"代替"补发"——这是唯一能覆盖"刷新页面/换设备"的方案。
  3. 存在高频客户端上行或二进制上行(语音、协作、实时画布)→ WebSocket,但不要裸写:引入 Socket.IO/SignalR/Centrifugo 之一,把重连、恢复、心跳、回退外包给框架;语音 agent 优先考虑服务端推荐的 WebRTC/WebTransport 形态。
  4. 需要支持多端、离线、后台完成通知 → 长连接之外补 Web Push;agent 状态必须外置到服务端,因为没有任何传输保证跨设备 continuity。
  5. 绿地项目、基础设施可控、追求极致延迟 → 可试点 WebTransport,同时保留 WebSocket 回退;2026-11 时点不建议把 WebTransport 作为唯一路径。

三个高频误区的提醒:

3.3 开放问题

  1. 可恢复性标准不齐:MCP 的 Last-Event-ID 重放是可选能力,OpenAI 的 previous_response_id 是私有契约,AI SDK 的 resumable streams 是框架自有方案——尚无跨厂商的"agent 任务流断点续传"标准。
  2. SSE 端到端背压缺位:HTTP 流控对 EventSource 不可见,agent 长任务中"服务端已产完、客户端还在渲染"的事件级积压没有标准反压信号;WebSocketStream 只解决了 WebSocket 一侧且生态未普及。
  3. 多 Agent 扇入:A2A 中 webhook 推送与 SSE 并存,推送模型重新抬头,协议收敛尚未完成。
  4. WebTransport 服务端生态:浏览器已 Baseline,nginx/LB/框架未跟上;若突破,语音/多模态 agent 将是第一落点。
  5. 鉴权与安全在"可恢复流"上的欠账:EventSource 无法自定义请求头,Cookie 之外的鉴权(如 Authorization: Bearer)只能退到查询参数、一次性 URL 或 Cookie 方案——各有泄露与 CSRF 权衡,业界并无统一范式;按 3.2 建议自建"事件编号 + Last-Event-ID 重放端点"时,天然引入越权面:该头完全由客户端控制、可伪造,重放端点必须校验事件归属(会话/用户),否则可被枚举拉取他人事件流。MCP 的 Mcp-Session-Id、Socket.IO 恢复所用的私有会话 ID 同理——恢复路径必须置于鉴权之后(Socket.IO 仅以 skipMiddlewares 警告点到为止,见 2.3.2)。MCP 规范早在 2024-11-05 版就写有安全警告(校验 Origin 头防 DNS rebinding、本地服务只绑 localhost、所有连接应实现鉴权),但跨框架的"恢复路径鉴权"最佳实践至今缺位。

四、参考来源

以下来源由两份章节研究提供:标注"(已抓取原文)"者为横轴章在会话内以 WebFetch 直接抓取核对的一手文档;其余为两章检索核对或转述来源。纵轴章标注"模型既有知识"的条目(微软 OWA iframe 流约 2000、Flash XMLSocket 2001、OpenAI stream:true 2023-03、Slack WebSocket 迁移与 Flannel 2014–2015)沿用未复核标注。标注"(修订时核对)"者为 2026-11-03 修订时重新抓取/检索核对的条目。

规范与标准

官方文档与工程一手来源

Agent 时代来源

综述与部署经验


附:两章矛盾的调和记录(供修订者参考)

矛盾/重复点纵轴表述横轴表述本报告处理
WebSocket 背压WebSocketStream(2024-04)补上浏览器侧背压经典 WebSocket API 无背压(MDN)1.6/2.3.4 各保留一处完整调和;洞察三改为规律性收束 + 一句指路(修订后执行)
Agent 背压方向服务端产完、客户端渲染慢,积压不可见token 生成速度即生产速度,客户端消化更快调和为 token 级 vs 事件级/任务级两层背压,完整表述只在 2.3.4(修订后洞察三仅指路)
长轮询地位Agent 时代"还魂"(Assistants API 轮询)完成历史使命,降级为协商回退兜底合并为"四次身份"叙事:主角→兜底→还魂→退场(洞察六)
MCP 规范链接modelcontextprotocol.io 2025-03-26 版mcpcn.com 2026-07-28 镜像 + 官方博客 2025-12-19修订后正文全部改引官方域名:1.7 引 2024-11-05 版、2.3.1 引 2025-03-26 版并在 1.8 补记 2026-07-28 版后续修订;镜像仅保留于参考来源存档
OpenAI Realtime2024-10 上线用 WebSocket,12 月加 WebRTC2025-03 GA 起浏览器端推荐 WebRTC合并为完整时间线(1.7 节)
重复内容SSE 重连、MCP Streamable HTTP、Socket.IO 4.6、防火墙问题在两章均出现同左事实归位到主叙述章节(纵轴讲演进、横轴讲对比),交叉处只留一句指路(修订后严格执行)

附2:审读意见处理记录(2026-11-03 独立审读意见,逐条对照)

#审读意见处理位置
1自设分层纪律被自己破坏(2.1 强调先分层,2.2/2.4 却混层)2.1 增加"L2 协议随其最常见载体对比"的说明;2.2 表题括注改为"(L1–L2)"、2.4 改为"(L2–L5)"2.1 / 2.2 / 2.4
2全称量化论断超出文内证据("所有主流 LLM API"等)+ MQTT 因果论断无来源三处收窄为"所对照的主流 LLM API(OpenAI、Anthropic 等)"并标注其余厂商未逐一复核;MQTT 影响论断降级为"存疑待考"TL;DR / 1.5 / 1.8 / 2.5
3Ably 提到 Vercel 原生 WebSocket 公测无对应 URL补具体链接(Ably《WebSockets on Vercel》),修订时抓取该页核对:2026-06-22 公测及函数时长、单实例绑定、无 fan-out 三项限制均与原文一致2.3.6 / 洞察四 / 参考来源
4MCP 引用镜像域名、版本悬空(2026-07-28 未交代、2024-11-05 引错版本)1.7 改引官方 2024-11-05 版传输规范(已核对);2.3.1 机制描述改引官方 2025-03-26 版并注明 2026-07-28 版现状;1.8 补记"2026-07-28 为后续修订";镜像仅存于参考来源存档1.7 / 1.8 / 2.3.1 / 参考来源
52.2"断线消息恢复"行判定标准各行不一统一为"原生 / 需应用层"两档口径:长轮询改"无原生;应用记序号可补(见 1.2 遗产)",SSE 改"无原生重放:浏览器自动携带 Last-Event-ID,重放需应用层配合",MCP 标注"协议内建重放语义"2.2
6背压调和内容三处/两处完整重复,违背"交叉处只留一句指路"1.6 与 2.3.4 各保留一处完整表述;洞察三只保留规律性收束并用一句指路衔接(两处调和均改为指路)1.6 / 2.3.4 / 洞察三
7术语与细节悬空(Baseline 未定义、WebKit 保留态度无来源、2 分钟措辞不一、tool-input-start 与 cache recovery 机制不可还原、ping 保活类别错置)首次出现处定义 Baseline(附 web.dev/baseline);WebKit 表述改写为有据版本(standards-positions #18,已核对:2022-06 开题、早期保留意见、2023-04-12 表态支持);三处统一为"官方示例 2 分钟"(经 Socket.IO 官方文档核对:无默认值表述,仅示例设 2 分钟);tool-input-start 机制按流协议文档还原(inputEncoding 随持久化部件保留);cache recovery 按 README 原文还原(订阅即送达最新一条 publication);ping 保活移出背压列、归入默认传输列的 SSE 选型理由1.6 / 1.8 / 2.2 / 2.3.2 / 2.4 / 3.2
8安全/鉴权维度整体缺位3.3 增补第 5 条开放问题:EventSource 无法自定义请求头时的鉴权方案取舍、Last-Event-ID 可伪造的重放端点越权风险、恢复路径鉴权(并引 MCP 2024-11-05 版规范自带的安全警告佐证)3.3

思考题(读完后想一想,参考答案可展开)

  1. 这份报告的核心结论是什么?为什么说断线重连的胜负手不在传输层而在会话层?
    参考答案

    报告结论是 SSE 已赢得实时 Agent UI 默认传输位:所对照的主流 LLM API(OpenAI、Anthropic 等)token 流一律走 SSE。裸传输有“三不保证”——投递、连续性、可观测性,胜负手因此在会话层:Socket.IO 状态恢复、Centrifugo 历史恢复、MCP 的 Last-Event-ID 重放。三十年绕回 HTTP,主战场从“保住连接”转向“保住状态流”。

  2. SSE+POST 与 WebSocket 各自适合什么场景?报告为何说选型由场景不对称性决定?
    参考答案

    报告给的是场景适配而非协议排名:Agent UI 上行是低频小消息(输入、确认、取消),下行是高频主负荷(token 流、工具事件),这种不对称让 SSE+POST 以极低成本覆盖多数场景——SSE 过一切代理、浏览器白送重连。WebSocket 胜在双工、低延迟、二进制,适配语音 agent、协作编辑、实时画布,但裸写要自担 Upgrade、sticky 路由、防火墙阻断与自建重连。

  3. 报告指出实时 Agent UI 最大的技术盲区和安全欠账分别是什么?
    参考答案

    最大盲区是背压:经典 WebSocket API 无背压,bufferedAmount 只能事后观测;Socket.IO 需手动 ack;SSE 只有 TCP/HTTP 隐式流控,EventSource 无标准反压信号,事件级积压不可见,只能靠 abort、分批发送、渲染节流兜底。安全欠账在可恢复流:Last-Event-ID 由客户端控制可伪造,重放端点不校验归属就会被拉取他人事件流。

  4. 对个人开发者做实时 Agent UI,报告给出的默认路径和三个高频误区是什么?
    参考答案

    从 SSE(HTTP/2)+ POST 上行起步,给事件编号并实现 Last-Event-ID 重放端点——自动重连只有在此前提下才“免费”;或用 AI SDK UI Message Stream v1 等现成协议。恢复先答三问:窗口(Socket.IO 示例 2 分钟)、范围、状态存哪,长任务加 checkpoint 落库。误区:默认选 WebSocket、把自动重连当恢复、指望传输层解决背压。

← 资料库今日播报 →