短轮询 · 长轮询 · SSE · WebSocket
实时获取服务器更新的 四种核心方案 全景对比
核心问题:HTTP 服务器无法主动向浏览器发起连接,浏览器始终是连接的发起方。那么客户端如何实时获取服务器更新?以下四种方案给出不同解法。
短轮询
Short Polling
浏览器以固定时间间隔不断向服务器发送 HTTP 请求,询问是否有新数据。无论服务器有无更新,都立即返回响应。
浏览器反复轮询,无论有无数据服务器都立即响应
优点
- 实现简单
- 兼容性最好
- 无需特殊服务端支持
缺点
- 大量无效请求
- 浪费带宽和服务器资源
- 实时性差
长轮询
Long Polling
浏览器发送请求后,服务器不立即返回,而是挂起连接,直到有新数据或超时才响应。浏览器收到响应后立即再次发起请求。
服务器挂起连接,有数据才返回,减少无效请求
优点
- 比短轮询减少无效请求
- 实时性较好
- 实现相对简单
缺点
- 每次返回仍需重新建立连接
- 高并发时服务器压力大
- 本质仍是"请求-响应"模式
服务器推送
Server-Sent Events (SSE)
浏览器与服务器建立连接后,服务器可以单向持续推送数据给浏览器。基于 HTTP 协议,连接建立后服务器主动发送事件流。
服务器建立连接后持续推送,单向通信
优点
- 服务器可主动推送
- 基于 HTTP,兼容性好
- 内置自动重连机制
- 实现简单
缺点
- 单向通信,浏览器无法回发数据
- 仅支持文本,不支持二进制
- 浏览器并发连接数有限
全双工通信
WebSocket
浏览器与服务器通过 HTTP 握手升级为 WebSocket 协议,建立全双工、持久化连接。双方可随时互相发送数据。
握手升级后建立全双工持久连接,双向随时通信
优点
- 全双工通信,双方可同时收发
- 低延迟,无需反复建立连接
- 支持二进制和文本数据
缺点
- 实现较复杂
- 需维护长连接,服务器资源消耗
- 老旧环境可能不兼容
四种技术横向对比
| 对比维度 | 短轮询 | 长轮询 | SSE | WebSocket |
|---|---|---|---|---|
| 通信方向 | 单向(拉) | 单向(拉) | 单向(推) | 双向 |
| 实时性 | ★★★ | ★★★ | ★★★ | ★★★ |
| 服务器资源消耗 | ★★★ 高 | ★★★ 中 | ★★★ 低 | ★★★ 低 |
| 协议 | HTTP | HTTP | HTTP | WebSocket |
| 实现复杂度 | 简单 | 较简单 | 简单 | 较复杂 |
| 数据格式 | 任意 | 任意 | 仅文本 | 文本 + 二进制 |
| 自动重连 | — | — | 内置 | 需自实现 |
| 典型场景 | 低频状态查询 | 实时通知 | 股票行情 / 新闻 | 聊天 / 游戏 / 协作 |
选型推荐
短轮询
低频更新、快速原型、兼容性优先
长轮询
实时通知、遗留系统、无需全双工
SSE
股票行情、新闻推送、日志流
WebSocket
聊天室、在线游戏、协作编辑