SSE流式响应机制
📚 核心概念
什么是 SSE?
SSE (Server-Sent Events) 是一种 HTML5 标准,允许服务器向浏览器推送实时事件流。
核心特点: - 🔄 单向通信: 服务器 → 客户端(浏览器) - 🌊 长连接: 基于 HTTP 的持久连接 - 📡 自动重连: 客户端断开后自动重连 - 🎯 事件类型: 支持自定义事件类型 - 💡 简单轻量: 比 WebSocket 更简单易用
SSE vs WebSocket vs 轮询
| 特性 | SSE | WebSocket | HTTP 轮询 |
|---|---|---|---|
| 通信方向 | 单向 (服务器→客户端) | 双向 | 单向 (客户端→服务器) |
| 协议 | HTTP/HTTPS | WebSocket (ws://) | HTTP/HTTPS |
| 实时性 | 实时推送 | 实时推送 | 延迟高 |
| 复杂度 | 简单 | 中等 | 简单 |
| 适用场景 | 实时通知、进度推送 | 聊天、游戏 | 低频更新 |
🔧 技术原理
SSE 工作流程
客户端 服务器
| |
| 1. 创建 EventSource |
|--------------------------->|
| GET /api/stream |
| |
| 2. 建立持久连接 |
|<---------------------------|
| HTTP 200 OK |
| Content-Type: text/event-stream |
| |
| 3. 服务器推送事件流 |
|<---------------------------|
| event: message |
| id: 1 |
| data: {"content": "..."} |
| |
| 4. 客户端接收并处理 |
| onmessage / on<event> |
| |
| 5. 持续推送... |
|<---------------------------|
| event: final_result |
| data: {"result": "..."} |
| |
| 6. 连接关闭 (可选) |
|---------------------------->|
| eventSource.close() |
SSE 消息格式
标准格式:
event: <事件类型>
id: <消息 ID>
data: <JSON 数据>
关键要素:
- event: 事件类型(message, final_result, error, ping, session)
- id: 消息唯一标识(用于去重和断点续传)
- data: JSON 格式的数据负载
- 空行:分隔每条消息(必需)