谈谈长轮询
- 长轮询是基于HTTP的实时通信技术
长轮询工作原理
- 客户端发起请求:客户端发送HTTP请求到服务器,并等待响应。
- 服务器保持连接:服务器收到请求后,不会立即响应,而是将连接挂起(hold),直到数据更新或达到预设超时时间。
- 响应与重连
- 有数据更新:服务器立即返回新数据,客户端处理数据后发起新请求。
- 超时无更新:服务器返回空响应,客户端重新发起请求。
长轮询实现方案流程
长轮询需要前后端配合
- 1、客户端向服务端发起请求
- 2、服务端挂起这个请求,若没有新数据,会保持连接状态,直到数据更新或者超时
- 通常会设置30-60秒
- 3、服务端响应处理
- 若有新数据,服务端会立即响应,客户端处理数据后立即发起新请求
- 若超时无数据,服务端返回空响应,如204状态码,客户端会重新发起请求
- 204 No Content:服务端已经成功处理了请求,但是没有返回任何内容
1、前端处理完数据后立即发起新请求,维持长轮询
2、注意长轮询发起请求使用ajax/fetch,不能使用WebSocket、SSE
为什么长轮询能够在一定程度上减轻服务端的压力
- 长轮询通过减少无效请求、复用连接和服务端主动控制响应,降低了服务端压力
- 减少无效请求次数,优化了传统的轮询模式
长轮询场景
实时获取、实时性
- 获取二维码的状态方案
- 长轮询由前端发起请求,服务端会等到二维码扫描完成后才响应
- 若二维码仍未被扫描,则会继续发送查询请求,直至状态变化(已失效或已成功)
长轮询和普通轮询区别
| 指标 | 普通轮询 | 长轮询 |
|---|---|---|
| 请求频率 | 固定间隔(如1秒1次) | 仅在数据更新或超时后触发(动态调整) |
| 连接建立次数 | 高(每次请求新建连接) | 低(连接复用,减少握手开销) |
| 无效请求比例 | 高(无数据更新时仍需处理请求) | 低(仅处理有效数据或超时) |
| 实时性 | 受限于轮询间隔(如1秒延迟) | 接近实时(数据更新后立即响应) |
| 适用场景 | 数据更新频率高且可预测 | 数据更新频率低或不可预测 |