高频行情系统架构:四层核心组件与数据流

高频行情系统是量化交易的基础设施,其架构设计直接影响数据延迟、吞吐量和可靠性。本章深入剖析行情系统的四层架构:接入层、处理层、分发层和存储层,明确每层的核心组件、职责边界以及数据流转路径。

一、四层架构总览

高频行情系统采用分层解耦设计,每层独立扩展、独立部署,通过标准协议进行通信。以下表格总结了各层的核心职责与关键组件:

架构层 核心职责 关键组件 延迟要求
行情接入层 对接交易所原始行情源,协议转换与数据校验 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、合约类型或随机采样,将部分流量路由到新版本分发服务。灰度策略支持动态配置,无需重启服务。
行情分发层灰度路由架构 行情处理层 灰度路由控制器 旧版分发服务 (v1.0) 新版分发服务 (v2.0) 交易策略 A 交易策略 B 风控系统 外部客户 灰度路由策略: • 策略 A、B 使用旧版 v1.0;风控系统使用新版 v2.0;外部客户按 10% 比例灰度到 v2.0 • 灰度比例通过配置中心动态调整,无需重启分发服务

五、行情存储层:数据资产沉淀

存储层负责将行情数据持久化,用于历史回测、策略优化、合规审计和故障排查。高频行情数据量巨大(单日可达 TB 级),存储架构需要兼顾写入性能和查询效率。

  • 时序数据库:如 InfluxDB、ClickHouse、TimescaleDB,针对时间序列数据优化写入和聚合查询。通常按时间分区存储,保留原始 tick 数据 7-30 天。
  • 消息队列:如 Kafka、Pulsar,作为数据缓冲层,解耦存储与处理层。行情数据先写入 Kafka,再由消费者写入时序库,避免写入抖动影响处理层。
  • 冷热分层存储:热数据(近 7 天)存储在 SSD 或内存中,支持毫秒级查询;冷数据(超过 30 天)压缩后迁移到 HDD 或对象存储(如 S3),降低存储成本。
灰度验证:存储层灰度发布通常涉及 Schema 变更(如新增字段、修改数据类型)。灰度期间需确保新旧 Schema 兼容,建议采用“双写”模式:新版本写入新表,旧版本写入旧表,通过数据一致性校验工具对比差异。

六、全链路数据流与延迟分布

理解数据流是灰度发布和监控的基础。以下 SVG 展示了行情数据从交易所到最终消费者的完整流转路径,并标注了每层的典型延迟贡献。

全链路数据流与延迟分布 交易所行情源 接入层 延迟: <10μs 处理层 延迟: <50μs 分发层 延迟: <100μs 存储层 延迟: 秒级 交易策略 风控系统 历史回测 监控告警 端到端延迟分析: • 交易所 → 接入层:网络传输延迟(取决于物理距离,通常 1-5μs) • 接入层 → 处理层 → 分发层:进程间通信延迟(共享内存 <1μs,TCP 环回 5-10μs) • 分发层 → 交易策略:组播延迟 <10μs,TCP 延迟 50-200μs(取决于网络拥塞)

七、灰度发布对四层架构的影响

灰度发布并非均匀作用于所有层。不同层的灰度策略、验证方法和回滚机制存在显著差异。以下表格总结了各层的灰度要点:

架构层 灰度粒度 验证方法 回滚策略
接入层 按交易所、按合约 影子流量 + 解码结果比对 切换回旧版组播流
处理层 按计算节点、按合约 双写比对(新旧引擎输出对比) 流量切回旧版引擎
分发层 按订阅者、按比例 端到端延迟对比 + 数据完整性校验 灰度路由配置回退
存储层 按表、按分区 Schema 兼容性检查 + 数据一致性校验 删除新表,恢复旧表
最佳实践:灰度发布应遵循“从下游到上游”的顺序,即先灰度存储层,再分发层,然后处理层,最后接入层。这样可以在灰度过程中,下游系统先验证新版本的数据正确性,避免上游变更影响下游。