主题
实时通信
HTTP 轮询与长轮询
轮询按周期请求更新。长轮询将请求挂起,直到有事件或超时,客户端随后发起下一次请求。
轮询间隔决定延迟和请求开销。长轮询要考虑代理超时、断线重试和事件游标。
SSE 与服务端单向推送
SSE 使用 text/event-stream 长响应,浏览器可用 EventSource 解析事件。连接断开后通常自动重连,并可发送 Last-Event-ID。
事件流从服务端到客户端,客户端写操作通过其他请求完成。代理缓冲可能延迟事件交付。
WebSocket 与双向通信
WebSocket 握手后可在同一连接双向传送文本或二进制消息。消息可由多个帧组成。
应用需处理断线重连、心跳和背压。浏览器 WebSocket 握手包含 Origin,服务端应验证来源。
各方式的连接模型与适用场景
低频且允许延迟的更新适合轮询。单向事件流可用 SSE。高频双向交互可用 WebSocket。长轮询适用于服务端等待事件再返回的普通 HTTP 模型。
| 方式 | 更新交付 | 重连与恢复 |
|---|---|---|
| 短轮询 | 周期性请求 | 下次请求继续查询 |
| 长轮询 | 每次请求等待事件或超时 | 客户端立即发起下一次请求 |
| SSE | 单个 HTTP 响应持续下发事件 | EventSource 可自动重连,可配合事件 ID |
| WebSocket | 双向消息通道 | 应用管理重连及状态恢复 |
选择时比较双向需求、重连恢复、代理支持和空闲连接成本。消息可靠性还取决于应用层协议。
