4. 统一接入架构设计
多数据源证券行情统一接入的核心矛盾,不是“能不能连上”,而是“在多个交易所、多个供应商、多种协议、多种频率并存的情况下,如何让上层业务只看到一份稳定、一致、可路由的行情视图”。解决这个矛盾的关键手段是分层架构:把连接差异、协议差异、字段差异、路由差异、性能差异分别收敛到独立层次,每层只解决一类问题,层与层之间通过明确契约通信。这样,新增一个数据源时,改动被限制在采集层与标准化层;新增一个下游消费方时,改动被限制在路由层与服务层。
一、核心原理:六层职责与数据契约
统一接入架构通常划分为采集层、标准化层、路由层、缓存层、服务层,并由高可用设计原则贯穿全部层次。采集层负责与外部数据源建立连接、订阅、心跳与断线重连,输出“原始行情事件”;标准化层把不同来源的字段、时间戳、价格精度、市场代码统一为内部标准模型;路由层根据订阅关系、市场、品种、优先级把标准化事件分发到正确的缓存分区与下游通道;缓存层保存最新快照、近期序列与热点数据,承担读放大与削峰;服务层对外提供统一 API、推送通道与订阅管理。高可用不是单独一层,而是每层都必须满足的约束:无单点、可降级、可观测、可恢复。
二、方法流程:从接入到服务的落地步骤
- 定义标准行情模型。先确定内部统一字段,例如
symbol、market、exchange_ts、ingest_ts、last、bid、ask、volume、seq、source。所有下游只依赖该模型,不依赖任何供应商字段。 - 采集层适配器化。每个数据源实现统一接口:
connect()、subscribe()、onMessage()、reconnect()、health()。适配器只做协议解析与原始事件封装,不做业务语义转换。 - 标准化层做字段与时间对齐。把供应商代码映射为内部代码,把价格按精度缩放为定点整数,把交易所时间与接入时间分别保留,避免用本地时间覆盖交易所时间。
- 路由层建立订阅路由表。按市场、品种、频道、优先级建立路由键,支持多源择优:同一品种有多个来源时,按优先级与新鲜度选择主源,主源异常时自动切换备源。
- 缓存层分区与副本。按市场或品种哈希分区,快照与序列分开存储;热点品种单独扩容,避免单一分区成为瓶颈。
- 服务层统一出口。提供快照查询、批量查询、实时推送与订阅管理,统一鉴权、配额、限流与降级策略。
三、案例场景:多源行情接入的典型配置
假设接入三个来源:交易所直连组播、供应商 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 |
| 路由层无背压 | 下游慢时无限堆积 | 内存暴涨、服务雪崩 | 引入队列水位、限流与死信通道 |
| 缓存层无分区 | 所有品种共用一个实例 | 热点品种拖垮全局 | 按市场或品种哈希分区,热点独立扩容 |
| 服务层无降级 | 缓存故障时直接报错 | 可用性下降,用户体验差 | 提供兜底快照、熔断与只读降级 |
复盘时建议重点检查三个指标:端到端延迟分布、主备切换次数与切换耗时、缓存命中率与分区倾斜度。如果切换次数异常高,说明主源健康判断过于敏感;如果缓存命中率低,说明路由键或分区策略与真实订阅模式不匹配。分层架构的价值不在于层数多,而在于每层都能被独立观测、独立扩容、独立替换,从而让多数据源行情接入在复杂环境中保持稳定与可演进。