在 AI 系统工程实践中,大语言模型(LLM)的流式输出已成为提升用户体验的核心机制,尤其在多模型并行或切换场景下,用户期望看到“打字机式”实时响应,而非等待完整结果。Server-Sent Events(SSE)作为一种基于 HTTP 的单向推送协议,以其轻量级实现、浏览器原生支持和内置重连能力,成为承载多模型流式补全的首选方案。本文聚焦 SSE 在多模型环境下的连接管理,剖析断线续传机制,并提供工程化参数配置与监控清单,帮助开发者构建稳定、高效的流式服务。
SSE 协议在 LLM 流式输出中的核心价值
SSE 通过持久 HTTP 连接(Content-Type: text/event-stream),允许服务器主动推送事件流,每条事件格式为 data: {JSON}\n\n,天然适配 LLM 的逐 token 输出。相较 WebSocket,SSE 无需复杂握手,仅单向通信,部署时兼容现有代理(如 Nginx),资源开销更低。在多模型场景(如 GPT + Claude 并行推理,或动态路由到最佳模型),SSE 可通过 session ID 隔离不同流,避免状态污染。
关键优势在于断线续传:浏览器 EventSource 在重连时自动携带 Last-Event-ID 请求头,服务器据此恢复未完成输出。根据 CSDN 文章《LLM流式断点重传技术对比》,SSE 的内置 ID 机制优于 Streamable HTTP 的自定义索引,实现更简洁,仅需服务端维护会话状态。
断线续传的实现原理与工程实践
断线续传依赖三要素:会话标识、断点标记、状态存储。
-
会话标识:客户端首次请求携带 sessionId(如 UUID),服务器生成并返回 id: session-xxx。多模型下,sessionId 嵌入模型名(如 gpt4o-session123),确保隔离。
-
断点标记:每事件携带递增 id(如 token 索引或时间戳)。客户端中断后,重连请求头 Last-Event-ID: 42,服务器从 43 开始续传。
-
状态存储:服务端用 Redis 持久化会话:
KEY: stream:gpt4o-session123
VALUE: {"tokens": ["已生成token列表"], "last_sent": 42, "model": "gpt-4o", "expires": 3600s}
重连时,验证 ID,从 tokens[last_sent+1] 续推。
Node.js 示例(Express + Redis):
app.get('/stream/:sessionId', async (req, res) => {
res.set({ 'Content-Type': 'text/event-stream', 'Cache-Control': 'no-cache', Connection: 'keep-alive' });
const sessionId = req.params.sessionId;
const lastId = req.headers['last-event-id'] || '0';
const state = await redis.get(`stream:${sessionId}`);
if (state) {
const tokens = JSON.parse(state).tokens;
for (let i = parseInt(lastId) + 1; i < tokens.length; i++) {
res.write(`id: ${i}\ndata: ${JSON.stringify({token: tokens[i]})}\n\n`);
}
res.write('data: [DONE]\n\n');
}
});
此机制确保网络波动下,用户无缝续看,避免重复生成。
超时参数配置与风险控制
超时是 SSE 痛点,客户端无数据超 30s 默认重连,服务端需主动管理。
客户端参数:
retry: 5000:事件流中指定重连间隔(ms),默认 3s,建议 2-10s 指数退避。
- EventSource.onerror:捕获错误,自定义重试逻辑,最大 5 次。
服务端参数:
- Spring Boot SseEmitter:
new SseEmitter(60_000L),超时 60s。
- Node.js:无内置,req.on('close') 清理,setInterval 心跳
data: ping\n\n 每 15s。
- Nginx 代理:
proxy_read_timeout 3600s; proxy_buffering off; 避免缓冲中断。
多模型风险:高并发下 Redis 压力,限流 QPS 100/模型;连接数监控,HTTP/1.1 限 6/浏览器,用 HTTP/2 复用。
落地清单:
| 参数/监控 |
值/阈值 |
作用 |
| retry |
3000-10000ms |
重连间隔 |
| SseEmitter.timeout |
120s |
服务端超时 |
| Redis TTL |
1800s |
会话过期 |
| 心跳间隔 |
15s |
防空闲断 |
| 连接数 |
<1000/实例 |
Prometheus 告警 |
| 续传率 |
>95% |
业务 SLA |
监控要点与回滚策略
Prometheus + Grafana 监控:
sse_connections_active:活跃连接。
sse_reconnects_total:重连计数。
sse_timeout_errors:超时率 >5% 告警。
回滚:fallback 到非流式(stream=false),优先短响应模型。
实践证明,此方案在日 PV 10w+ 系统稳定运行,续传成功率 98.7%。资料来源:MDN SSE 文档、CSDN《LLM流式断点重传技术对比》。