流式接口是什么
流式接口是把结果分批或持续推给客户端的几种手段的总称:轮询按固定间隔拉取,实现最简单但空转多;长轮询让服务端挂起请求直到有数据或超时,近实时且兼容性好;SSE(Server-Sent Events)由服务端单向推送文本事件流,适合通知、进度与日志;WebSocket 提供双向低延迟通道,适合聊天与协作编辑。选择依据是交互方向、实时性要求与运维成本,而不是技术新鲜度。
基本信息
| 轮询 | 客户端定时拉取,实现简单,实时性取决于间隔 |
|---|---|
| 长轮询 | 请求挂起至有数据或超时,兼容性好,服务端连接占用偏高 |
| SSE | 基于 HTTP 的单向事件流,自动重连,文本协议易调试 |
| WebSocket | 双向全双工,适合交互密集场景,需要单独的连接管理 |
| 共有问题 | 心跳保活、代理空闲超时、断线重连与补偿拉取 |
典型使用场景
- 任务进度与日志:长任务把阶段进度持续推给页面,SSE 足够
- 消息通知:站内消息与提醒,单向推送即可满足
- 实时协作:共同编辑、光标同步等需要双向高频通信,用 WebSocket
- 行情与监控大屏:数据变化频繁,按需推送优于固定轮询
- AI 生成类接口:边生成边返回,用户等待体验明显改善
- 兼容老客户端:客户端力弱或代理受限时,长轮询是稳妥选择
方式对比
| 方式 | 方向 | 适用场景 | 注意点 |
|---|---|---|---|
| 轮询 | 客户端拉取 | 实时性要求低、实现最简单 | 间隔小则空转开销大,间隔大则滞后明显 |
| 长轮询 | 客户端拉取(挂起) | 近实时且需兼容旧客户端 | 服务端连接与超时管理成本高 |
| SSE | 服务端单向推送 | 通知流、进度与日志流 | 浏览器并发连接数受限,需处理自动重连的去重 |
| WebSocket | 双向通信 | 聊天、协作、需要客户端回传的场景 | 需要心跳、鉴权续期与断线补偿 |
连接与断线处理要点
连接与断线处理要点
# 1 心跳:服务端定期发送注释行或 ping 帧,避免代理因空闲断开
# 2 超时对齐:心跳间隔明显小于网关与负载均衡的空闲超时
# 3 重连退避:客户端按指数退避重连,避免故障时形成重连风暴
# 4 补偿拉取:重连成功后按最后的游标或序号补拉缺失事件
# 5 去重:服务端保证事件 ID 稳定,客户端按 ID 去重后再渲染
# 6 鉴权续期:长连接期间令牌过期要有续期或重建连接的明确路径流式接口的容量口径与普通接口不同:它按并发连接数而非 QPS 计费与限流,容量规划要单独按连接数、内存与文件描述符评估。
断线期间的补偿策略要提前定义:只靠重连会丢掉中间事件,用游标补拉或定期全量对账才能让客户端状态收敛。