欢迎光临
我们一直在努力

SSE、WebSocket、WebTransport:给实时 AI 交互选传输层

三种传输方式按交互需求选择

一个接口只向浏览器输出文本,为什么要先搭一套双向通道?反过来,一个需要并发上传音频、接收结果的应用,也不能只因为已有 SSE 就假装需求没变。

传输选型应从消息方向、交付语义和基础设施开始。协议名字越新,不意味着首字必然更快;TTFT 里可能包含排队、模型计算、代理缓冲和渲染等待,换一条连接并不会让这些成本一起消失。

先写需求,再写协议

SSE 描述服务端向客户端持续发送事件的方式。浏览器的其他请求仍然可以向服务端发控制指令。“SSE单向”不等于整个应用只能单向通信,也不适合用 half-duplex 去描述它。

WebSocket 提供双向消息通道。WebTransport 进一步暴露多路流与数据报等能力,但服务端、网络和客户端都要支持对应路径。是否需要可丢弃数据,是否要把不同流分开处理,应由业务回答,不能从协议宣传语反推需求。

需求可以优先评估的路线仍须另做的事情
主要是文本下行,控制动作少 SSE/HTTP流 事件身份、结束原因、取消确认
持续双向消息 WebSocket 鉴权、重连、应用消息与重放
明确需要多路流或数据报 WebTransport 服务端与浏览器支持、拥塞与失败策略

这张表是起点。它不是浏览器兼容表,也不是速度排名。AI SDK 的 UI 数据流仍采用 SSE 格式,并通过带类型的消息部件表达文本、工具结果和终态,说明单向数据流也能承载丰富交互。Stream Protocols

一个不偷偷降级语义的决策函数

先用纯函数把选型条件说清楚,避免 UI 代码里出现“探测到某 API 就立刻使用”的隐式选择:

import assert from 'node:assert/strict';

function chooseTransport(need, support) {
if (need.datagrams || need.independentStreams) {
if (support.webtransport) {
return { transport: 'webtransport', unmet: [] };
}
return {
transport: null,
unmet: ['required WebTransport semantics unavailable']
};
}
if (need.bidirectional) {
return support.websocket
? { transport: 'websocket', unmet: [] }
: { transport: null, unmet: ['bidirectional channel unavailable'] };
}
return support.sse
? { transport: 'sse', unmet: [] }
: { transport: null, unmet: ['streaming HTTP unavailable'] };
}

assert.equal(chooseTransport({}, { sse: true }).transport, 'sse');
assert.equal(chooseTransport(
{ bidirectional: true }, { websocket: true }).transport, 'websocket');
assert.equal(chooseTransport(
{ datagrams: true }, { websocket: true }).transport, null);
assert.equal(chooseTransport(
{ independentStreams: true }, { webtransport: true }).transport,
'webtransport');
console.log('selection policy checks passed');

support 在这里是已经确认过的端到端能力,不是仅检查 window.WebTransport 的结果。客户端有构造函数,但代理或服务端不支持,照样不能把它当作可用。

第三个断言刻意返回“不满足”,没有偷偷把数据报需求换成可靠消息。实际产品当然可以降级,但要说明降级后改变了什么:更高延迟、丢弃策略变化,还是功能暂停。更换协议与满足原需求不是同一件事。

需求与传输语义的匹配示意

连接取消,不是业务取消的回执

浏览器调用 abort、关闭 writer 或重置流,能够改变本地与传输层状态。它不能单独证明服务端推理已经停止,更不能证明账单已经按某个结果结算。

应用仍要定义:哪个任务被取消,服务端是否接受取消,最后一个可恢复游标是什么,客户端收到不明结果时怎样显示。文本 UI 的恢复另文讨论,这里只保留边界:传输层终止不能替代应用层终态。

Web Streams 的背压同样有具体作用范围。某段管道的消费者变慢,可以通过队列和拉取机制限制上游交付;要让模型调度器改变推理行为,还需要服务端确实接上对应控制。Streams概念

标准状态不能提前写到未来

2026年7月30日的 WebTransport 快照是 Candidate Recommendation Snapshot,文中写明至少保持候选阶段到10月30日。这不是“10月30日必然正式”,更不是可以预写的产品上线新闻。W3C快照

本文不提供“纳秒打断”“零队头阻塞”或固定倍数的性能结论。即使不同流减少了某一类相互等待,流内有序交付、共享拥塞控制与应用队列也仍然存在。丢包条件、连接是否复用、是否完成握手,都要写进实验条件。

需要比较时,先固定同一个服务端、相同负载和相同网络扰动,再分别记录连接建立、第一条业务事件与取消确认。没有这样的实验,就把文章写成选型审查,而不是跑分。

上面的纯函数只验证策略分支,不验证任何真实网络协议栈,也不证明特定浏览器和网络已经支持对应能力。

本地核验:Node.js v26.3.0,独立保存本文 JavaScript 后运行 node,断言通过。这里只验证纯函数和构造的测试输入,不是网络或真实团队收益实测。

赞(0)
未经允许不得转载:171主机测评 » SSE、WebSocket、WebTransport:给实时 AI 交互选传输层
分享到: 更多 (0)

评论 抢沙发

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址