用途:SSE 让网页从服务器获取更新。与 WebSocket 不同,SSE 是单向的(服务器到客户端),基于标准 HTTP。适用于单向实时流式推送、LLM 逐 token 流式输出、实时活动流与仪表盘(比分、股票、系统指标、通知数),并可受益于 HTTP/2 多路复用及标准 HTTP 基础设施、防火墙、负载均衡与认证头。
主要能力:text/event-stream 协议格式,数据以纯文本块推送、以双换行结束,支持 id、event、data 字段;浏览器 EventSource 客户端 API 内置自动重连与事件分发;通过 Last-Event-ID 实现可恢复流,重连时浏览器自动发送最后收到的 ID,服务器可重放遗漏事件。
使用方式:客户端用 new EventSource("/api/events") 订阅,通过 onmessage 或 addEventListener 处理事件;服务端设置 Content-Type: text/event-stream、Cache-Control: no-cache、Connection: keep-alive,并以 data: <payload>\n\n 格式写入。LLM 流式场景可逐块写入 data: {"text": ...}\n\n,结束时发送 event: done。
最佳实践:设置 X-Accel-Buffering: no 关闭 Nginx 等反向代理缓冲;为事件分配唯一单调递增 ID 以支持断线恢复;每 15-30 秒发送注释作为保活;生产环境使用 HTTP/2 规避 HTTP/1.1 每域 6 连接限制。
限制与注意:需要双向客户端消息时应改用 WebSocket;跨域流需配置 Access-Control-Allow-Origin 等 CORS 头;客户端断开时应监听 req.on('close') 及时释放后端资源。常见问题包括代理缓冲导致响应被缓存、CORS 错误等。参考资料为 MDN Server-Sent Events。