返回列表

websocket与sse

2026-03-17

websocket与sse

1. WebSocket 与 SSE 概念

WebSocket

  • 双向通信协议,基于 TCP。
  • 特点:
    • 建立连接后可双向实时发送数据。
    • 可以用于聊天、游戏、协作编辑。
  • 常用技术点:
    • 断线重连
    • 心跳(ping/pong)

SSE(Server-Sent Events)

  • 单向通信协议,基于 HTTP。
  • 浏览器内置 EventSource API 支持:
    • 自动重连
    • last-event-id 消息恢复
    • retry 控制重连间隔
  • 优势:
    • CDN 友好
    • HTTP 协议兼容性好
    • 适合 AI 流、日志流等单向实时数据

2. WebSocket 的断线重连与心跳

  • 心跳机制:
    • 客户端或服务端定期发送 ping/pong 或自定义消息
    • 检测连接是否活跃
  • 自动重连:
    • 大多数现代 WebSocket 库(如 socket.iows)支持心跳和自动重连
    • 可自定义重连时间、次数、指数退避策略

3. SSE 自动重连机制

  • 浏览器内置 EventSource
    • 连接断开后自动重连
    • 默认重连时间约 3 秒,可由服务器 retry 指令控制
  • 消息恢复:
    • id: 字段 + Last-Event-ID header
  • 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
      

4. WebSocket 在 Kubernetes 的问题

  • Pod 滚动更新导致长连接断开 → 大量客户端重连(Reconnect Storm)
  • 解决方案:
    1. Connection Draining / preStop hook
    2. 客户端指数退避重连
    3. Sticky Session / session affinity
    4. 消息总线解耦(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 的新协议
  • 核心能力:
    1. 双向流(Bidirectional Streams)
    2. 单向流(Unidirectional Streams)
    3. 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、消息总线
0 条评论

发表评论

暂无评论,快来发表第一条评论吧!