SSE(Server-Sent Events)是实现单向服务器推送的简单方案,适合流式日志、状态更新或轻量级实时通知。本文介绍实现模式、心跳/重连与与回退策略。
SSE 优势与限制
- 优势:实现简单、基于 HTTP,易于通过代理与 CDN 回源;浏览器端支持 EventSource API。
- 限制:仅支持单向流(服务器到客户端),对大量并发连接需要注意服务器资源(每个连接保持 HTTP 长连接)。
实现要点(Node.js 示例)
- 在服务端设置合适的
Content-Type: text/event-stream、禁用响应缓存并定期发送心跳以防连接断开。 - 提供重连策略:客户端默认会在连接断开后自动重连,可在事件中发送
retry指令调整重连间隔。
伸缩与回退
- 对于高并发情形使用连接池或转发层(如 Nginx、Envoy)并监控连接数;必要时回退到 WebSocket 或短轮询方案。
示例参考:
// 简化的 Express SSE 示例
app.get('/sse', (req, res) => {
res.setHeader('Content-Type', 'text/event-stream');
res.setHeader('Cache-Control', 'no-cache');
res.write('retry: 10000\n\n');
const id = setInterval(() => res.write(`data: ${JSON.stringify({ t: Date.now() })}\n\n`), 3000);
req.on('close', () => clearInterval(id));
});