websocket与sse
2026-03-17
websocket与sse
1. WebSocket 与 SSE 概念
WebSocket
- 双向通信协议,基于 TCP。
- 特点:
- 建立连接后可双向实时发送数据。
- 可以用于聊天、游戏、协作编辑。
- 常用技术点:
- 断线重连
- 心跳(ping/pong)
SSE(Server-Sent Events)
- 单向通信协议,基于 HTTP。
- 浏览器内置
EventSourceAPI 支持:- 自动重连
- last-event-id 消息恢复
- retry 控制重连间隔
- 优势:
- CDN 友好
- HTTP 协议兼容性好
- 适合 AI 流、日志流等单向实时数据
2. WebSocket 的断线重连与心跳
- 心跳机制:
- 客户端或服务端定期发送 ping/pong 或自定义消息
- 检测连接是否活跃
- 自动重连:
- 大多数现代 WebSocket 库(如
socket.io、ws)支持心跳和自动重连 - 可自定义重连时间、次数、指数退避策略
- 大多数现代 WebSocket 库(如
3. SSE 自动重连机制
- 浏览器内置
EventSource:- 连接断开后自动重连
- 默认重连时间约 3 秒,可由服务器
retry指令控制
- 消息恢复:
id:字段 +Last-Event-IDheader
- keepalive:
- 服务器每 15~30 秒发送注释行防止代理断开
- 生产环境注意:
- Nginx:
proxy_buffering off - HTTP header:
Content-Type: text/event-stream Cache-Control: no-cache Connection: keep-alive X-Accel-Buffering: no
- Nginx:
4. WebSocket 在 Kubernetes 的问题
- Pod 滚动更新导致长连接断开 → 大量客户端重连(Reconnect Storm)
- 解决方案:
- Connection Draining / preStop hook
- 客户端指数退避重连
- Sticky Session / session affinity
- 消息总线解耦(Kafka、Redis)
5. 浏览器连接数限制
- HTTP/1.1 默认每域名 6 个连接
- 阻塞影响:SSE 长连接可能占满连接池,HTTP 请求排队
- HTTP2 多路复用可解决该问题
6. HTTP3 + QUIC 对实时通信的影响
- QUIC 特性:
- 基于 UDP
- 多流独立(无队头阻塞)
- 0-RTT 连接(低延迟)
- 网络切换不中断
- 影响:HTTP3 + SSE / HTTP3 streaming 可以替代部分 WebSocket 场景
7. WebTransport
- 基于 HTTP3 + QUIC 的新协议
- 核心能力:
- 双向流(Bidirectional Streams)
- 单向流(Unidirectional Streams)
- Datagram(UDP)传输
- 优势:
- 无队头阻塞
- 多路复用
- 支持低延迟 UDP 传输
- 网络切换不中断
- 应用场景:实时游戏、音视频、云游戏、实时 AI 数据流
- 浏览器支持:Chrome/Edge 支持,Safari 部分支持,Firefox 实验性支持
- 示例:
const transport = new WebTransport("https://example.com:4433/webtransport");
await transport.ready;
const stream = await transport.createBidirectionalStream();
const writer = stream.writable.getWriter();
const reader = stream.readable.getReader();
await writer.write(new TextEncoder().encode("hello"));
const { value } = await reader.read();
console.log(value);
8. WebSocket 高并发问题
- 每个连接占用 TCP socket、文件描述符、内存、TCP buffer、CPU、带宽
- 高并发优化:
- epoll / event loop
- 多进程 / 多节点
- Gateway 集群 + 消息队列(Kafka、Redis)
- 连接分片(Sharding)
- 降低 buffer、心跳频率
- 理论 vs 实际:理论上百万级连接,单机约 10~20 万连接困难
9. 大厂实践经验
- Nginx / Go 高并发服务器可支撑百万连接
- Node.js WebSocket 服务器单机约 10 万连接
- 架构模式:
Client │ ▼ WebSocket Gateway Cluster │ ▼ Message Queue │ ▼ Backend Services
10. 总结
- SSE:单向,浏览器自动重连,HTTP 友好,适合流式 AI / 日志等
- WebSocket:双向,长连接,适合聊天、协作编辑、游戏
- HTTP/2 / HTTP/3 + SSE:可替代 WebSocket 部分场景,解决 TCP 队头阻塞
- WebTransport:WebSocket 2.0,HTTP3 + QUIC 支持双向、多流、UDP,适合超低延迟场景
- 高并发架构注意事项:FD、内存、CPU、带宽、负载均衡、Gateway、消息总线