SSE 如何工作?
未标记
考查重点:事件流传输与断线恢复。SSE用HTTP响应保持事件流,服务端按text/event-stream持续发送事件;客户端EventSource接收,并可借事件ID恢复断线后的进度
本题目录
参考答案
核心回答
SSE 是基于 HTTP 响应的服务端事件流。客户端发起请求,服务端以 Content-Type: text/event-stream 持续写入 UTF-8 文本;客户端按空行分隔事件,再读取 event、data、id 等字段。它适合模型输出、任务进度这类主要由服务端持续推送的场景。
原生浏览器 EventSource 提供接收、错误通知和自动重连。服务端若发送事件 id,浏览器重连时可以带上 Last-Event-ID;是否能补发遗漏事件,还取决于服务端有没有保存事件及实现重放。
一条事件怎样到达页面
id: task-42:8
event: progress
data: {"taskId":"task-42","step":"检索完成"}
最后的空行结束这条事件。前端用 addEventListener("progress", handler) 接收,event.data 是字符串,约定为 JSON 时再解析。多行 data: 会以换行拼接;以冒号开头的行是注释,适合心跳,不会触发普通业务消息。
SSE 是事件格式,不等于每次网络读取恰好是一条事件。一条事件可能分成多次读取,也可能多条事件一起到达。HTTP/2 仍可承载 SSE,无需依赖 HTTP/1.1 的 Transfer-Encoding: chunked。
重连不等于重新执行任务
任务提交与事件订阅可以分开:先创建持久任务,再订阅其事件。断线后继续查询同一个任务,按事件序号补发或返回最新快照。前端用事件标识去重;业务收到完成或失败事件后主动关闭订阅,避免把正常任务结束当成需要无限重连。
双向高频通信可以考虑 WebSocket;仅需推送进度时,SSE 能沿用常见的 HTTP 接入方式。两者都需要处理鉴权、代理超时和慢客户端。
对应教程
- 电商问数第15章:API接口基础与FastAPI入门:回看流式响应与
SSE消息格式。 - 电商问数第17章:前后端联调与日志追踪:回看
progress、result、error的前后端约定。
参考资料
- 国内:阿里云:传统 HTTP 模式与 SSE:采用
UTF-8文本及id/event/data字段,说明SSE是HTTP响应中的事件格式。 - 国内:阿里云百炼:流式输出:采用模型文本逐步返回的例子,说明单向事件流的实际用途。
- 国内:CloudWeGo:Hertz SSE:采用服务端写事件、客户端读取及保存最后事件标识的职责划分。
- 国内:阿里云点金:Agent 事件数据模型:借鉴业务完成、失败与连接事件分开表达的方式,说明终态需要显式处理。
- 国外:WHATWG:Server-sent events:核对空行分帧、多行
data、注释与Last-Event-ID的协议语义。 - 国外:Microsoft:Fetch Event Source:核对原生客户端与
Fetch客户端的区别,说明重连控制并不是所有实现都自动提供。
