概述
LLM输出通常较长,流式传输可提升交互体验。结合分片标记与游标状态可在网络中断后实现续传与幂等重试,提升鲁棒性与用户体验。
关键实践与参数
- 传输协议: SSE用于单向文本流,WebSocket用于双向控制
- 分片标记: 为每段输出标记
seq与cursor - 断点续传: 客户端携带
cursor请求续传 - 重试安全: 基于请求ID去重,幂等生成并缓存片段
- 观测: 记录流会话时长、片段数量与重试次数
示例/配置/实现
// Node.js SSE 服务端
import express from 'express'
const app = express()
app.get('/stream', (req, res) => {
res.setHeader('Content-Type', 'text/event-stream')
res.setHeader('Cache-Control', 'no-cache')
const cursor = Number(req.query.cursor || 0)
const chunks = ['Hello', ' ', 'world', '!']
for (let i = cursor; i < chunks>
// 浏览器 SSE 客户端
let cursor = 0
function start() {
const es = new EventSource(`/stream?cursor=${cursor}`)
es.addEventListener('chunk', (e) => {
const { seq, text } = JSON.parse(e.data)
cursor = seq + 1
document.body.innerText += text
})
es.onerror = () => { es.close(); setTimeout(start, 1000) }
}
start()
// WebSocket 双向控制(续传请求)
const ws = new WebSocket('wss://example.com/llm')
ws.onopen = () => { ws.send(JSON.stringify({ type: 'resume', cursor: 2 })) }
ws.onmessage = (e) => { const m = JSON.parse(e.data); /* append m.text */ }
验证
- 中断恢复: 断网后重连携带
cursor,从下一片段继续 - 幂等与去重: 重试同一请求ID不重复生成与返回片段
- 延迟与体验: 记录首片段延迟与整体拼接耗时
- 兼容性: SSE与WebSocket在不同网络环境下均可工作
注意事项
- 流式接口需限速与断路保护
- 存储与缓存片段需设置生命周期
- 对超长输出进行分页与终止控制
- 结合鉴权与账单策略管理会话
架构设计与最佳实践
任务队列系统是分布式架构的核心组件,LLM 服务端流式传输与断点续传(SSE/WebSocket、分片与验证)在高并发场景下需要重点关注以下方面:
核心设计原则
- 消息可靠性:确保消息不丢失,使用 ACK 确认与重试机制
- 幂等性设计:同一消息多次消费结果一致,避免重复处理
- 背压控制:动态调整消费速率,防止系统过载
- 故障隔离:单队列故障不影响整体系统可用性
性能优化建议
- 使用连接池管理数据库/Redis连接,减少连接开销
- 批量消费提升吞吐量,但需平衡延迟要求
- 合理设置并发数,避免上下文切换开销
- 监控队列深度与消费延迟,及时扩缩容
生产检查清单
- 死信队列配置与告警规则
- 消息重试策略(指数退避、最大重试次数)
- 端到端追踪ID集成
- 灰度发布与回滚方案
架构设计与最佳实践
任务队列系统是分布式架构的核心组件,LLM 服务端流式传输与断点续传(SSE/WebSocket、分片与验证)在高并发场景下需要重点关注以下方面:
核心设计原则
- 消息可靠性:确保消息不丢失,使用 ACK 确认与重试机制
- 幂等性设计:同一消息多次消费结果一致,避免重复处理
- 背压控制:动态调整消费速率,防止系统过载
- 故障隔离:单队列故障不影响整体系统可用性
性能优化建议
- 使用连接池管理数据库/Redis连接,减少连接开销
- 批量消费提升吞吐量,但需平衡延迟要求
- 合理设置并发数,避免上下文切换开销
- 监控队列深度与消费延迟,及时扩缩容
生产检查清单
- 死信队列配置与告警规则
- 消息重试策略(指数退避、最大重试次数)
- 端到端追踪ID集成
- 灰度发布与回滚方案

发表评论 取消回复