长轮询
记录时间:2026-03-24 14:43
最后编辑:2026-03-24 14:44
长轮询
长轮询(Long Polling) 是一种基于 HTTP 协议、用于实现准实时数据推送的通信模式。它通过让服务器 “挂起” 请求,直到有新数据或超时才返回,大幅减少无效请求,兼顾兼容性与实时性。
流程
- 客户端发起请求:前端发送 HTTP 请求(通常携带上次数据标识,如
lastId),并设置超时(如 30s)。 - 服务器挂起请求:服务器收到请求后,不立即响应,而是将请求挂起,持续检查是否有新数据。
- 触发响应:
- 有新数据:服务器立即返回数据,关闭连接。
- 超时无数据:服务器返回空响应,关闭连接。
- 客户端重连:客户端收到响应(无论是否有数据),立即发起下一次长轮询请求,形成循环。
| 对比项 | 短轮询(Short Polling) | 长轮询(Long Polling) |
|---|---|---|
| 响应时机 | 无论有无数据,立即返回 | 有数据 / 超时才返回,挂起等待 |
| 请求频率 | 客户端固定间隔高频请求 | 收到响应才发下一次,动态低频 |
| 实时性 | 取决于轮询间隔(延迟高) | 数据到达即推送(近实时) |
| 资源消耗 | 大量无效请求,带宽 / 服务器开销大 | 减少无效请求,但服务器需维持大量挂起连接 |
| 驱动方 | 客户端定时驱动 | 服务器事件 / 超时驱动 |
优点
- 兼容性极强:基于标准 HTTP,所有浏览器 / 服务器均支持。
- 实时性好:比短轮询延迟低,接近 “推送” 效果。
- 减少无效请求:无数据时不频繁往返,节省带宽。
缺点
- 服务器压力大:长时间挂起连接占用内存 / 文件描述符,高并发下易成瓶颈。
- 仍有 HTTP 开销:每次响应后需重建连接,头部数据重复传输。
- 超时与重连复杂:需处理网络波动、超时、异常重连逻辑。
典型应用场景
- 实时通知 / 消息:Web IM、系统公告、订单状态更新。
- 扫码登录 / 支付:客户端等待服务器扫码确认事件。
- 配置 / 服务发现:如 Nacos 配置中心、服务状态监听。
- 降级方案:WebSocket 不可用时,作为兼容 fallback。
与 WebSocket 的关系
- 长轮询:基于 HTTP 短连接,单向通信(客户端先请求),实现简单、兼容好,但非真正长连接。
- WebSocket:独立协议,双向全双工长连接,实时性 / 效率更高,但需额外支持、兼容性稍差。
