引言
近年来,基于 Transformer
的大模型推动了 AI
产业的飞速发展,同时带来了新的技术挑战:
- 流式传输 vs 批量返回:大模型生成的长文本若需一次性返回,会显著影响用户体验,实时推送成为必需。
- 语音交互需求:语音助手要求毫秒级响应,而非等待用户完整输入后再返回结果。
- 高并发负载:大模型
API
需支持数千甚至数万用户同时在线,对通信效率提出更高要求。
这些需求催生了对实时通信技术的关注,而 SSE
(服务器发送事件)和 WebSocket
成为开发者关注的焦点。
什么是 SSE
(服务器发送事件)?
SSE
(Server-Sent Events
,服务器发送事件)是一种基于 HTTP
协议 的技术,允许服务器主动向客户端推送实时数据。它特别适用于需要流式传输的场景。
在 AI
场景中的应用
它的工作方式非常适用于 AI
应用,如:
- 流式返回
AI
生成文本:如ChatGPT
或腾讯云大模型API
,用户可逐字接收生成内容。 - 实时分析推送:如情感分析或
NLP
处理结果的持续更新。 - 任务进度监控:如批量推理任务的实时状态反馈。
SSE
的优点
✅ 简单易用:基于标准 HTTP
,前端通过 EventSource API
即可实现,无需复杂配置。
✅ 自动重连:浏览器支持断开后自动重连,默认间隔约 2 秒,可通过 retry
字段自定义。
✅ 高效性:相较于轮询更节省资源,但在高并发下需关注连接管理。
✅ 流式传输:支持即时推送部分结果,降低用户等待延迟。
✅ 兼容性强:适配现有 HTTP
基础设施,支持 CDN
和代理服务器,可结合缓存优化性能。
SSE
的消息格式
- 数据编码:必须为
UTF-8
编码的文本。 HTTP
头信息:Content-Type: text/event-stream
Cache-Control: no-cache
Connection: keep-alive
- 事件流格式:每条消息由多行字段组成,格式为
field: value\n
,消息间以\n\n
分隔。常用字段包括:data
:消息内容event
:事件类型id
:消息唯一标识,用于断线重连retry
:重试间隔(毫秒)
示例消息:
id: 12345
event: update
data: 这是一条更新消息
id: 12346
event: update
data: 这是一条新的更新消息
在这个示例中,服务器发送了两条消息,每条消息包含 id
、event
和 data
字段,每条消息之间用两个换行符分隔。
SSE
实现示例
后端(Go
):
package main
import (
"fmt"
"net/http"
"time"
)
func sseHandler(w http.ResponseWriter, r *http.Request) {
// 设置必要的头信息,确保客户端识别为 SSE 流
w.Header().Set("Content-Type", "text/event-stream")
w.Header().Set("Cache-Control", "no-cache")
w.Header().Set("Connection", "keep-alive")
flusher, ok := w.(http.Flusher)
if !ok {
http.Error(w, "Streaming unsupported"<