4. 统一接入架构设计

多数据源证券行情统一接入的核心矛盾,不是“能不能连上”,而是“在多个交易所、多个供应商、多种协议、多种频率并存的情况下,如何让上层业务只看到一份稳定、一致、可路由的行情视图”。解决这个矛盾的关键手段是分层架构:把连接差异、协议差异、字段差异、路由差异、性能差异分别收敛到独立层次,每层只解决一类问题,层与层之间通过明确契约通信。这样,新增一个数据源时,改动被限制在采集层与标准化层;新增一个下游消费方时,改动被限制在路由层与服务层。

一、核心原理:六层职责与数据契约

统一接入架构通常划分为采集层、标准化层、路由层、缓存层、服务层,并由高可用设计原则贯穿全部层次。采集层负责与外部数据源建立连接、订阅、心跳与断线重连,输出“原始行情事件”;标准化层把不同来源的字段、时间戳、价格精度、市场代码统一为内部标准模型;路由层根据订阅关系、市场、品种、优先级把标准化事件分发到正确的缓存分区与下游通道;缓存层保存最新快照、近期序列与热点数据,承担读放大与削峰;服务层对外提供统一 API、推送通道与订阅管理。高可用不是单独一层,而是每层都必须满足的约束:无单点、可降级、可观测、可恢复。

分层架构的本质是“变化隔离”:外部协议变化止于采集层,字段语义变化止于标准化层,消费关系变化止于路由层,性能压力变化止于缓存层,接口形态变化止于服务层。
统一接入六层架构:数据自左向右收敛,高可用约束纵向贯穿 采集层 TCP / 组播 / WebSocket 连接与订阅 心跳与重连 原始事件输出 断线补拉 去重与序号 标准化层 字段 / 时间 / 精度 市场代码映射 价格与量纲统一 时间戳对齐 标准行情模型 版本化 Schema 路由层 订阅关系与优先级 按市场路由 按品种路由 多源择优与切换 背压与限流 死信与重投 缓存层 快照 / 序列 / 热点 最新快照 近期序列 分区与副本 读放大收敛 过期与淘汰 服务层 统一 API 与推送 订阅管理 快照查询 实时推送 鉴权与配额 降级与熔断 高可用约束:无单点 · 可降级 · 可观测 · 可恢复 · 幂等重放 · 多源择优

二、方法流程:从接入到服务的落地步骤

  1. 定义标准行情模型。先确定内部统一字段,例如 symbol、market、exchange_ts、ingest_ts、last、bid、ask、volume、seq、source。所有下游只依赖该模型,不依赖任何供应商字段。
  2. 采集层适配器化。每个数据源实现统一接口:connect()、subscribe()、onMessage()、reconnect()、health()。适配器只做协议解析与原始事件封装,不做业务语义转换。
  3. 标准化层做字段与时间对齐。把供应商代码映射为内部代码,把价格按精度缩放为定点整数,把交易所时间与接入时间分别保留,避免用本地时间覆盖交易所时间。
  4. 路由层建立订阅路由表。按市场、品种、频道、优先级建立路由键,支持多源择优:同一品种有多个来源时,按优先级与新鲜度选择主源,主源异常时自动切换备源。
  5. 缓存层分区与副本。按市场或品种哈希分区,快照与序列分开存储;热点品种单独扩容,避免单一分区成为瓶颈。
  6. 服务层统一出口。提供快照查询、批量查询、实时推送与订阅管理,统一鉴权、配额、限流与降级策略。

三、案例场景:多源行情接入的典型配置

假设接入三个来源:交易所直连组播、供应商 A 的 TCP 行情、供应商 B 的 WebSocket 行情。路由层配置如下,主源为交易所直连,备源为供应商 A,兜底为供应商 B。当主源超过 500ms 无数据或序号断裂时,路由层触发切换,并记录切换事件。

route:
  market: SH
  symbol: 600519
  sources:
    - name: exchange_multicast
      priority: 1
      timeout_ms: 500
    - name: vendor_a_tcp
      priority: 2
      timeout_ms: 800
    - name: vendor_b_ws
      priority: 3
      timeout_ms: 1200
  switch_policy: freshness_then_priority
  dedup_key: [market, symbol, exchange_ts, seq]

标准化层输出示例:

{
  "symbol": "600519",
  "market": "SH",
  "exchange_ts": 1710000000123,
  "ingest_ts": 1710000000135,
  "last": 168850,
  "bid": 168849,
  "ask": 168851,
  "volume": 1234500,
  "seq": 88231,
  "source": "exchange_multicast"
}

四、误区与复盘:分层架构常见的五个坑

误区表现后果修正策略
采集层做业务转换适配器里直接改字段名、算涨跌幅新增数据源时逻辑重复,难以维护采集层只输出原始事件,转换下沉到标准化层
标准化层丢失原始时间只用本地时间覆盖交易所时间无法做延迟分析与乱序判断同时保留 exchange_ts 与 ingest_ts
路由层无背压下游慢时无限堆积内存暴涨、服务雪崩引入队列水位、限流与死信通道
缓存层无分区所有品种共用一个实例热点品种拖垮全局按市场或品种哈希分区,热点独立扩容
服务层无降级缓存故障时直接报错可用性下降,用户体验差提供兜底快照、熔断与只读降级
高可用设计原则可以归纳为六条:无单点、可降级、可观测、可恢复、幂等重放、多源择优。每一条都要在采集、标准化、路由、缓存、服务五层中分别找到落点,而不是只在服务层做限流。
不要为了“统一”而把不同市场的交易时段、涨跌停规则、精度规则强行合并。统一的是接入契约与字段模型,不是业务规则。业务规则应通过市场元数据配置化,而不是硬编码在标准化层。

复盘时建议重点检查三个指标:端到端延迟分布、主备切换次数与切换耗时、缓存命中率与分区倾斜度。如果切换次数异常高,说明主源健康判断过于敏感;如果缓存命中率低,说明路由键或分区策略与真实订阅模式不匹配。分层架构的价值不在于层数多,而在于每层都能被独立观测、独立扩容、独立替换,从而让多数据源行情接入在复杂环境中保持稳定与可演进。