流式接口选型

把结果分批推给客户端的手段:轮询简单但延迟与开销高,长轮询减少空转,SSE 适合单向推送,WebSocket 支持双向低延迟通信;按交互需要选择。

流式接口是什么

流式接口是把结果分批或持续推给客户端的几种手段的总称:轮询按固定间隔拉取,实现最简单但空转多;长轮询让服务端挂起请求直到有数据或超时,近实时且兼容性好;SSE(Server-Sent Events)由服务端单向推送文本事件流,适合通知、进度与日志;WebSocket 提供双向低延迟通道,适合聊天与协作编辑。选择依据是交互方向、实时性要求与运维成本,而不是技术新鲜度。

基本信息

轮询客户端定时拉取,实现简单,实时性取决于间隔
长轮询请求挂起至有数据或超时,兼容性好,服务端连接占用偏高
SSE基于 HTTP 的单向事件流,自动重连,文本协议易调试
WebSocket双向全双工,适合交互密集场景,需要单独的连接管理
共有问题心跳保活、代理空闲超时、断线重连与补偿拉取

典型使用场景

  • 任务进度与日志:长任务把阶段进度持续推给页面,SSE 足够
  • 消息通知:站内消息与提醒,单向推送即可满足
  • 实时协作:共同编辑、光标同步等需要双向高频通信,用 WebSocket
  • 行情与监控大屏:数据变化频繁,按需推送优于固定轮询
  • AI 生成类接口:边生成边返回,用户等待体验明显改善
  • 兼容老客户端:客户端力弱或代理受限时,长轮询是稳妥选择

方式对比

方式方向适用场景注意点
轮询客户端拉取实时性要求低、实现最简单间隔小则空转开销大,间隔大则滞后明显
长轮询客户端拉取(挂起)近实时且需兼容旧客户端服务端连接与超时管理成本高
SSE服务端单向推送通知流、进度与日志流浏览器并发连接数受限,需处理自动重连的去重
WebSocket双向通信聊天、协作、需要客户端回传的场景需要心跳、鉴权续期与断线补偿

连接与断线处理要点

连接与断线处理要点
# 1 心跳:服务端定期发送注释行或 ping 帧,避免代理因空闲断开
# 2 超时对齐:心跳间隔明显小于网关与负载均衡的空闲超时
# 3 重连退避:客户端按指数退避重连,避免故障时形成重连风暴
# 4 补偿拉取:重连成功后按最后的游标或序号补拉缺失事件
# 5 去重:服务端保证事件 ID 稳定,客户端按 ID 去重后再渲染
# 6 鉴权续期:长连接期间令牌过期要有续期或重建连接的明确路径
流式接口的容量口径与普通接口不同:它按并发连接数而非 QPS 计费与限流,容量规划要单独按连接数、内存与文件描述符评估。
断线期间的补偿策略要提前定义:只靠重连会丢掉中间事件,用游标补拉或定期全量对账才能让客户端状态收敛。

易错点

  • 忽略中间代理空闲超时:长连接被静默断开,客户端长时间收不到数据
  • 断线重连不做补偿:事件丢失无人发现,前端状态与后端长期不一致
  • 无重连退避:服务端故障时大量客户端同时重连,形成连接风暴
  • 鉴权只在建立连接时校验:长连接长期有效,令牌吊销后仍能接收数据
  • 把流式连接当普通请求规划容量:连接数与内存占用失控

数据来源与参考

  • RFC 9110 HTTP Semantics
  • WHATWG 规范:Server-Sent Events 与 WebSocket
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌