跳转至

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 格式的数据负载 - 空行:分隔每条消息(必需)