高频行情系统架构:四层核心组件与数据流
高频行情系统是量化交易的基础设施,其架构设计直接影响数据延迟、吞吐量和可靠性。本章深入剖析行情系统的四层架构:接入层、处理层、分发层和存储层,明确每层的核心组件、职责边界以及数据流转路径。
一、四层架构总览
高频行情系统采用分层解耦设计,每层独立扩展、独立部署,通过标准协议进行通信。以下表格总结了各层的核心职责与关键组件:
| 架构层 | 核心职责 | 关键组件 | 延迟要求 |
|---|---|---|---|
| 行情接入层 | 对接交易所原始行情源,协议转换与数据校验 | FIX/FAST 网关、UDP 组播接收器、行情适配器 | < 10 μs |
| 行情处理层 | 数据清洗、合并、计算衍生指标(如买卖十档、加权均价) | 行情引擎、快照生成器、事件处理器 | < 50 μs |
| 行情分发层 | 将处理后的行情数据推送给内部交易系统与外部客户 | 组播分发器、TCP/WebSocket 推送服务、灰度路由 | < 100 μs |
| 行情存储层 | 持久化原始与加工后的行情数据,支持回放与离线分析 | 时序数据库、消息队列、冷热分层存储 | 秒级(写入) |
架构原则:每层之间通过无锁队列或共享内存传递数据,避免跨网络调用带来的延迟抖动。接入层与处理层通常部署在同一台物理机或同一机柜内,使用 RDMA 或 DPDK 技术加速。
二、行情接入层:第一道关卡
接入层是行情系统的入口,直接面对交易所的原始数据流。其核心挑战在于:协议多样性(FIX 4.2/4.4、FAST、Binary)、高吞吐(单交易所可达百万级消息/秒)以及数据完整性(丢包重传、序列号校验)。
- FIX/FAST 网关:负责将交易所的 FIX 或 FAST 协议解码为内部统一格式。FAST 协议通过模板压缩字段,解码性能是关键瓶颈。
- UDP 组播接收器:多数交易所使用 UDP 组播发布行情,接收器需处理乱序、丢包和重复包。通常采用双通道冗余接收(主/备组播流)。
- 行情适配器:针对不同交易所(如 CME、SSE、SZSE)实现差异化逻辑,包括心跳检测、登录认证、会话恢复。
灰度关注点:接入层灰度发布时,需验证新版本网关对旧协议的解码兼容性,以及 UDP 组播流的切换是否导致丢包。建议采用“影子流量”模式,新版本只接收数据不对外输出,对比解码结果。
三、行情处理层:核心计算引擎
处理层负责将原始行情数据转化为交易系统可用的结构化行情。该层是延迟敏感度最高的环节,通常使用 C++ 或 Rust 实现,并采用无锁数据结构和CPU 亲和性绑定。
- 行情引擎:维护订单簿(Order Book),处理逐笔成交(Trade)和逐笔委托(Order)事件,实时更新买卖盘口。
- 快照生成器:按固定时间间隔(如 100ms)或事件触发(如价格变动超过阈值)生成市场快照,包含买卖十档、成交量、持仓量等。
- 事件处理器:计算衍生指标,如 VWAP(成交量加权均价)、TWAP(时间加权均价)、波动率、买卖价差等,供策略层使用。
// 伪代码:行情引擎核心循环
while (true) {
event = order_book_ring_buffer.pop(); // 无锁队列获取事件
switch (event.type) {
case ADD_ORDER:
order_book.add(event.order);
break;
case EXECUTE_TRADE:
order_book.execute(event.trade);
break;
case CANCEL_ORDER:
order_book.cancel(event.order_id);
break;
}
if (event.timestamp - last_snapshot_time >= snapshot_interval) {
snapshot_generator.generate(order_book);
last_snapshot_time = event.timestamp;
}
}
灰度风险:处理层算法变更(如订单簿合并逻辑、快照生成策略)可能导致行情数据不一致。灰度期间必须同时运行新旧两套处理引擎,通过“双写比对”验证输出结果的一致性。
四、行情分发层:高效路由与灰度控制
分发层是行情系统的出口,负责将处理后的数据推送给多个下游消费者,包括交易策略、风控系统、外部客户等。该层需要支持多协议(UDP 组播、TCP、WebSocket)、多主题(按合约、按交易所订阅)以及灰度路由。
- 组播分发器:用于内部低延迟场景,通过 UDP 组播将行情数据广播到同一网络段内的所有订阅者。延迟可控制在 10μs 以内。
- TCP/WebSocket 推送服务:用于外部客户或跨网络场景,支持按需订阅、断线重连、增量推送。通常使用 Protobuf 或 FlatBuffers 编码。
- 灰度路由:根据订阅者 ID、合约类型或随机采样,将部分流量路由到新版本分发服务。灰度策略支持动态配置,无需重启服务。
五、行情存储层:数据资产沉淀
存储层负责将行情数据持久化,用于历史回测、策略优化、合规审计和故障排查。高频行情数据量巨大(单日可达 TB 级),存储架构需要兼顾写入性能和查询效率。
- 时序数据库:如 InfluxDB、ClickHouse、TimescaleDB,针对时间序列数据优化写入和聚合查询。通常按时间分区存储,保留原始 tick 数据 7-30 天。
- 消息队列:如 Kafka、Pulsar,作为数据缓冲层,解耦存储与处理层。行情数据先写入 Kafka,再由消费者写入时序库,避免写入抖动影响处理层。
- 冷热分层存储:热数据(近 7 天)存储在 SSD 或内存中,支持毫秒级查询;冷数据(超过 30 天)压缩后迁移到 HDD 或对象存储(如 S3),降低存储成本。
灰度验证:存储层灰度发布通常涉及 Schema 变更(如新增字段、修改数据类型)。灰度期间需确保新旧 Schema 兼容,建议采用“双写”模式:新版本写入新表,旧版本写入旧表,通过数据一致性校验工具对比差异。
六、全链路数据流与延迟分布
理解数据流是灰度发布和监控的基础。以下 SVG 展示了行情数据从交易所到最终消费者的完整流转路径,并标注了每层的典型延迟贡献。
七、灰度发布对四层架构的影响
灰度发布并非均匀作用于所有层。不同层的灰度策略、验证方法和回滚机制存在显著差异。以下表格总结了各层的灰度要点:
| 架构层 | 灰度粒度 | 验证方法 | 回滚策略 |
|---|---|---|---|
| 接入层 | 按交易所、按合约 | 影子流量 + 解码结果比对 | 切换回旧版组播流 |
| 处理层 | 按计算节点、按合约 | 双写比对(新旧引擎输出对比) | 流量切回旧版引擎 |
| 分发层 | 按订阅者、按比例 | 端到端延迟对比 + 数据完整性校验 | 灰度路由配置回退 |
| 存储层 | 按表、按分区 | Schema 兼容性检查 + 数据一致性校验 | 删除新表,恢复旧表 |
最佳实践:灰度发布应遵循“从下游到上游”的顺序,即先灰度存储层,再分发层,然后处理层,最后接入层。这样可以在灰度过程中,下游系统先验证新版本的数据正确性,避免上游变更影响下游。