SSE - Server-SendEvent
概念
SSE 全称Server-Sent Eents, 是HTML5标准的一部分,它的核心是基于HTTP长连接的服务器单向推送技术
- 客户端通过
EventSourceAPI发起一个HTTP的GET请求 - 服务器响应的ContentType设置为text/event-stream
- 连接保持打开状态,服务器可以持续发送数据
- 数据格式遵循特定的文本协议,每个消息以
\n\n结束
特点
协议层的天然优势
- 协议层:基于HTTP协议,现在的硬件设备原生都支持
- 安全集成:直接复用现有的认证机制,不需要设计独立的健全方案
- 监控链路:HTTP的监控体系可以直接复用,包括请求日志,性能指标、错误追踪等
内置的客户端健壮性
- 自动重连机制:连接断开后,浏览器会自动尝试重连,无需手动实现
- 消息ID追踪:通过
Last-Event-ID头部,客户端重连时可以告诉服务器从哪里断开,服务器可以从断点继续发送,避免消息丢失、 - 连接状态管理:浏览器自动处理TCP层面的连接保持和心跳
与WebSocket的核心技术差异
连接建立层面:
SSE:标准的HTTP GET请求,遵循完整的HTTP握手流程,包括TLS协商、认证等。
WebSocket:基于HTTP Upgrade机制切换到独立的ws协议,建立完全独立的二进制通道
数据传输层面:
SSE:文本格式,UTF-8编码,每个消息以\n\n分隔,自动自持多行数据
WebSocket:支持文本和二进制帧,帧结构更紧凑,但需要手动处理消息分片和组装
连接层面管理:
SSE:浏览器自动管理重连,开发者可设置retry字段控制重试间隔
WebSocket:需要手动实现ping/pong心跳、重连逻辑、连接状态机