1. 行情流消费场景与WebSocket定位

在数字资产交易、证券行情、外汇报价等场景中,价格不是"查一次就完事"的静态数据,而是持续变化的事件流。一个 BTC/USDT 现货行情,在活跃时段每秒可能产生数十到数百次盘口与成交更新;如果把这些更新当作"需要不断重新查询的资源",系统设计就会天然落后于市场。因此,本课程的第一件事不是写代码,而是把"行情流消费"这件事的对象、通道和边界想清楚。

实时行情推送的业务需求

行情消费方的需求可以归纳为三类,它们对通道的要求并不相同:

  • 时效性:从交易所撮合产生成交,到策略或界面看到该成交,延迟要尽可能低。做市、套利、风控强平监控对延迟尤其敏感,通常要求端到端在百毫秒级。
  • 连续性:行情是"增量 + 快照"的组合。订阅后先拿到一份盘口快照,再持续接收增量更新;中间断流会导致本地盘口与交易所不一致,因此需要断线重连与快照重建机制。
  • 多路复用:一个连接往往同时订阅多个交易对、多个频道(深度、成交、K 线、标记价格)。通道要支持在一个长连接上按主题分发消息,而不是为每个标的开一条连接。

与之相对,如果采用"客户端定时问服务器要最新价"的模式,时效性受轮询间隔限制,连续性靠每次全量拉取保证,多路复用则退化为多次请求。这正是需要引入推送型通道的根本原因。

WebSocket 与 HTTP 轮询、SSE 的对比

三种常见方案的本质差异在于"谁发起数据传递"以及"连接是否长期保持":

维度 HTTP 短轮询 SSE(Server-Sent Events) WebSocket
连接形态 每次请求新建,短连接 单个长连接,HTTP 响应流 单个长连接,握手后升级为全双工
数据方向 客户端拉,服务器答 服务器单向推送 双向,客户端可发订阅/心跳
典型延迟 受轮询间隔约束,通常秒级 较低,事件到达即推 低,事件到达即推
协议开销 每次请求带完整头部 文本事件流,头部仅握手一次 握手后为轻量帧,开销小
适用场景 低频、非实时查询 单向通知、行情看板 需动态订阅、双向交互的行情流

对行情消费而言,关键区别在于订阅是动态的:策略可能中途增加交易对、切换频道、调整深度档位。SSE 只能由服务器单向推送,客户端要改变订阅往往得重建连接或另走 HTTP 接口;WebSocket 则允许在已建立的连接上直接发送订阅消息,服务器按主题回推,天然契合"一个连接、多主题、可增删"的行情消费模型。因此本课程选择 WebSocket 作为行情流通道。

行情流消费通道对比:拉取 vs 单向推送 vs 双向订阅 HTTP 短轮询 客户端 服务器 请求 全量响应 请求 全量响应 请求 全量响应 间隔内变化丢失,延迟受轮询周期约束 SSE 单向推送 客户端 服务器 建立事件流 事件推送 事件推送 事件推送 事件推送 服务器单向,客户端改订阅需重建 WebSocket 双向 客户端 服务器 握手升级 订阅 depth/btcusdt 快照 + 增量 增量更新 增量更新 追加订阅 trade 心跳 / 增量 单连接多主题,可动态增删订阅

典型交易所行情流协议概览

主流交易所的 WebSocket 行情接口在细节上不同,但骨架高度一致,理解这个骨架后迁移成本很低:

  • 连接地址:通常按"现货/合约""公共/私有"拆分不同 URL,例如公共行情流与账户私有流分开,避免权限混用。
  • 订阅消息:客户端发送 JSON,形如 {"method":"SUBSCRIBE","params":["btcusdt@depth@100ms","btcusdt@trade"],"id":1},用 id 关联应答。
  • 推送消息:服务器回推带 stream 或 e(事件类型)字段的 JSON,如深度更新 depthUpdate、逐笔成交 trade、K 线 kline。
  • 快照与增量:深度频道一般先给快照,再给带序号(如 U/u 或 lastUpdateId)的增量,消费方需按序号拼接。
  • 心跳与限频:多数协议要求客户端定期发 ping 或依赖服务器 ping,长时间无消息需主动重连;订阅数量与消息速率有上限。

这些字段名在不同交易所会有差异,但"订阅—快照—增量—序号—心跳"这条主线是通用的。本课程示例以这条主线为教学对象,不绑定某一家交易所的私有细节。

本课程示例的边界与目标

为避免示例变成"某个交易所 SDK 的使用说明",需要明确边界。范围内:建立并维持一条 WebSocket 连接;发送订阅、解析推送;用序号把快照与增量拼成一致的本地盘口;处理心跳、断线重连与重订阅;把解析后的行情以回调或队列形式交给下游策略。示例参数采用合理假设,例如订阅 btcusdt@depth@100ms 与 btcusdt@trade,本地维护前 20 档盘口,重连退避从 1 秒起、上限 30 秒。

范围外:交易所鉴权与私有账户流、历史数据回补、撮合与下单、生产级多活容灾。这些会在后续章节按需展开,但第一章先把"消费一条公共行情流"这件事做扎实。

判断示例是否达标的可观察依据:连接建立后能收到快照;连续增量到达时本地盘口买一卖一随推送变化;人为断开网络后能在退避时间内重连并重新订阅;重连后盘口与交易所快照一致,不出现"价格跳回旧值"的错乱。

把上述内容收束成一句话:行情流消费的本质是"在一条可双向通信的长连接上,按主题持续接收增量,并用序号与快照保证本地状态正确"。WebSocket 之所以成为默认选择,不是因为它新,而是因为它在时效性、连续性和动态订阅三方面同时满足行情场景的要求。接下来的章节将围绕这条主线,从连接建立、订阅管理、消息解析到盘口重建逐步展开。