短轮询 · 长轮询 · SSE · WebSocket

实时获取服务器更新的 四种核心方案 全景对比

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