长轮询

记录时间:2026-03-24 14:43 最后编辑:2026-03-24 14:44

长轮询

长轮询(Long Polling) 是一种基于 HTTP 协议、用于实现准实时数据推送的通信模式。它通过让服务器 “挂起” 请求,直到有新数据或超时才返回,大幅减少无效请求,兼顾兼容性与实时性。

流程

  1. 客户端发起请求:前端发送 HTTP 请求(通常携带上次数据标识,如 lastId),并设置超时(如 30s)。
  2. 服务器挂起请求:服务器收到请求后,不立即响应,而是将请求挂起,持续检查是否有新数据。
  3. 触发响应
    1. 有新数据:服务器立即返回数据,关闭连接。
    2. 超时无数据:服务器返回空响应,关闭连接。
  4. 客户端重连:客户端收到响应(无论是否有数据),立即发起下一次长轮询请求,形成循环。
对比项短轮询(Short Polling)长轮询(Long Polling)
响应时机无论有无数据,立即返回有数据 / 超时才返回,挂起等待
请求频率客户端固定间隔高频请求收到响应才发下一次,动态低频
实时性取决于轮询间隔(延迟高)数据到达即推送(近实时
资源消耗大量无效请求,带宽 / 服务器开销大减少无效请求,但服务器需维持大量挂起连接
驱动方客户端定时驱动服务器事件 / 超时驱动

优点

  • 兼容性极强:基于标准 HTTP,所有浏览器 / 服务器均支持。
  • 实时性好:比短轮询延迟低,接近 “推送” 效果。
  • 减少无效请求:无数据时不频繁往返,节省带宽。

缺点

  • 服务器压力大:长时间挂起连接占用内存 / 文件描述符,高并发下易成瓶颈。
  • 仍有 HTTP 开销:每次响应后需重建连接,头部数据重复传输。
  • 超时与重连复杂:需处理网络波动、超时、异常重连逻辑。

典型应用场景

  • 实时通知 / 消息:Web IM、系统公告、订单状态更新。
  • 扫码登录 / 支付:客户端等待服务器扫码确认事件。
  • 配置 / 服务发现:如 Nacos 配置中心、服务状态监听。
  • 降级方案:WebSocket 不可用时,作为兼容 fallback。

与 WebSocket 的关系

  • 长轮询:基于 HTTP 短连接,单向通信(客户端先请求),实现简单、兼容好,但非真正长连接。
  • WebSocket:独立协议,双向全双工长连接,实时性 / 效率更高,但需额外支持、兼容性稍差。
标签 :