需要说明的是,HTTP/2 Server Push已在2026年前后被Chrome等主流浏览器移除支持,但概念层面仍有参考价值,本文会给出明确说明。
服务器推送方式的核心答案:目前主流的服务器推送方式分为三大类短轮询、长轮询、WebSocket与Server-Sent Events(SSE),其中WebSocket是真正意义上的全双工双向推送,SSE是轻量级单向推送,而轮询是用“拉”来模拟“推”的过渡方案。
先分清主动推和被动拉:两类交互模式的底层差异
理解服务器推送方式有哪些,核心先搞懂“推”和“拉”的底层逻辑差异,用一个生活场景比喻:你去快递柜取包裹(拉),和快递员送上门(推),体验完全不同。
HTTP天然是“拉”的协议:客户端发请求,服务器给响应,对话结束,所以想让服务器主动发消息,必须绕过这个限制。
目前所有推送方案,本质是两类:
- 客户端主动拉取数据,模拟出“推”的效果(轮询类方案)
- 建立持久化连接,让服务器在连接上主动写数据(WebSocket和SSE)
前者实现简单但效率低,后者实现稍复杂但实时性高。
网站服务器推送方式的三大类全解析
短轮询:最朴素但消耗最大的“模拟推送”
短轮询的实现逻辑很简单:客户端用定时器,每隔几秒向服务器发一次HTTP请求,问“有没有新数据?”,有就返回新数据,没有也返回一个空响应。
开发中常用setInterval配合fetch来实现,缺点明显:
- 大量无效请求占用带宽
- 服务器并发压力大
- 实时性受轮询间隔限制
适用场景:实时性要求不高(几秒延迟可接受)、并发量小的内部管理后台,比如一个简单的定时刷新排行榜。
长轮询:短轮询的改良版,靠“挂起请求”实现准实时
长轮询解决的是短轮询“无数据也响应”的浪费问题,客户端发请求后,服务器不立即响应,把请求挂起,等有新数据或超时(通常30秒左右)才返回,客户端收到响应后立刻发起新请求。
这个过程可以用伪代码表述:
async function longPoll() {
const res = await fetch('/api/poll'); // 这个请求可能挂起20-30秒
// 处理数据
longPoll(); // 收到响应立刻重新发起
}
长轮询的优点是兼容性极好,任何浏览器和HTTP库都能实现,缺点是仍需要多次重建连接,服务器挂起大量请求时资源开销不小。
WebSocket:唯一真正的全双工主动推送协议
WebSocket是服务器推送方式里唯一能做到全双工的方案:客户端和服务器都可在同一连接上随时发送消息,握手阶段依赖HTTP协议完成升级,之后连接独立于HTTP。
连接建立后,服务器可以:
- 实时推送股票行情
- 即时推送聊天消息
- 下发协同编辑的操作指令
行业共识认为,WebSocket是目前实时推送场景的首选,它的使用成本在于服务端实现比普通HTTP复杂,且部分企业防火墙需要额外放行。
Server-Sent Events(SSE):轻量级单向推送最优解
SSE是常被中文开发者忽略的方案,但其实现成本远低于WebSocket,它基于原生HTTP协议,客户端通过EventSource接口发起连接,服务器用text/event-stream类型持续返回数据。
一个最简单的SSE服务端响应格式:
data: 第一条消息
data: 第二条消息
id: 1
客户端只需三行代码:
const source = new EventSource('/events');
source.onmessage = (e) => console.log(e.data);
SSE最大的优势是自动重连和基于HTTP/2可复用连接,缺点是只能服务器单向推给客户端,客户端想发消息还得走普通HTTP请求。
服务器推送和轮询的区别:四个维度看清本质
很多开发者在选型时纠结于轮询和推送,这里用一个表格把区别说透:
| 对比维度 | 轮询(短/长) | WebSocket | SSE |
|---|---|---|---|
| 连接模式 | 每次请求独立连接 | 一次握手,持久连接 | 一次请求,持久连接 |
| 方向性 | 客户端主动拉取 | 双向实时推送 | 服务器单向推送 |
| 实时性 | 依赖轮询间隔 | 毫秒级 | 毫秒级 |
| 服务器开销 | 大量无效请求,开销高 | 连接维护成本,但无重复请求 | 连接维护成本,比WebSocket更低 |
| 浏览器兼容 | 全兼容 | 现代浏览器全兼容 | 除IE外全兼容 |
| 实现复杂度 | 极低 | 较高,需处理心跳、断线重连 | 低,自带重连 |
核心结论:服务器推送和轮询的区别在于轮询是“客户端问、服务器答”,推送是“服务器主动说、客户端听着”,前者天然浪费资源,后者才是真正意义上的推送机制。
SSE和WebSocket场景选择:从实际需求倒推技术方案
选哪种推送方式,不能拍脑袋,从业务需求倒推是好办法。
优先选SSE的场景
- 只需要服务端单向下发消息,比如行情展示、日志实时输出、通知提醒
- 项目团队对WebSocket不熟,希望用最小成本实现推送
- 需要自动重连,不想自己写断线重连逻辑
具体场景案例:一个数据大屏展示系统,服务器每5秒推送一次销量数据,SSE配合HTTP/2可以复用连接,代码量只有WebSocket方案的三分之一。
优先选WebSocket的场景
- 需要双向交互,比如在线聊天、互动白板、多人在线游戏
- 需要客户端主动发消息且要求低延迟,比如远程控制类应用
- 服务端需要主动推送二进制数据,比如实时音频流传输(虽然也可以base64编码,但效率低)
轮询该什么时候用
- 老板只要求“能实现”,不关心成本,且服务端是纯PHP等难维护长连接的环境
- 请求频率极低,比如每5分钟刷新一次最新公告
- 兼容老旧的浏览器环境,比如企业内部IE浏览器终端
HTTP/2 Server Push的特殊说明与选型总思路
还有一个特殊方案HTTP/2 Server Push,它能实现服务器主动推送资源到客户端缓存,在2026年已不被主流浏览器支持,实际生产环境不建议采用。
当业务需要服务器推送时,按这个思路走基本不会错:
- 先判断是否需要双向通信,需要就选WebSocket,不需要就再看下一步
- 是否需要兼容老旧浏览器,需要就用长轮询,不需要就选SSE
- 并发量大不大,并发大且单向就用SSE,并发小且单向就用长轮询+时间戳增量查询也能凑合
技术选型不追求绝对正确,只追求“够用且易于维护”,很多业务用长轮询就完全够用,硬上WebSocket反而拖慢开发进度。
最后回到本文核心:服务器推送方式的完整图景已经清晰短轮询是最廉价的探索,长轮询是妥协,WebSocket站在实时交互的顶端,SSE则是“够用就好”是务实之选,根据不同业务阶段和资源情况,选择相匹配的技术方案,才是最好的工程实践。
服务器推送方式常见问题解答
问:WebSocket会被SSE替代吗?
不会,WebSocket的全双工特性是SSE无法替代的,在线聊天、互动游戏等场景必须依赖WebSocket,SSE解决的是“只需要服务器单向推”时的高效问题,两者是互补关系。
问:服务器推送方式选型时,最容易被忽略的点是什么?
连接断线后的恢复逻辑,WebSocket需要自行实现心跳检测和重连机制,处理不当容易造成连接泄漏,SSE自动重连是优点,但要留意Last-Event-ID头实现断点续传逻辑,否则重连后会丢失断线期间的消息。
首发原创文章,作者:王坚,如若转载,请注明出处:https://idctop.com/article/796541.html


