一、网关架构总览:为什么需要统一网关?核心设计目标与架构分层

做量化交易这些年,我见过太多团队在网关这块栽跟头。说实话,我自己早期也踩过不少坑。今天咱们就来聊聊,为什么非得搞个统一网关,它的核心目标是什么,架构又该怎么分层。

1.1 为什么需要统一网关?

先问个问题:你手上有几个交易所的API要对接?

我见过最夸张的情况,一个团队同时维护着6个交易所的接入代码。每个交易所的API风格都不一样——有的用REST,有的用WebSocket;有的返回JSON,有的返回Protobuf;有的限频100次/秒,有的限频10次/秒。更别提那些奇葩的签名算法和错误码了。

这会导致什么问题?

  • 重复劳动:每个交易所都要写一套连接管理、心跳检测、重连逻辑
  • 维护噩梦:交易所API一升级,所有接入代码都得跟着改
  • 故障扩散:某个交易所的异常连接可能拖垮整个交易系统
  • 策略耦合:策略代码里充斥着交易所特定的逻辑,想换个交易所?重写吧

核心痛点:没有统一网关,你的交易系统就像一团乱麻。每加一个交易所,复杂度就翻一倍。

我在项目中遇到过一家量化基金,他们最初就是每个交易所单独写接入。后来要接入第5个交易所时,整个技术团队崩溃了——因为之前的代码风格完全不统一,新来的工程师根本看不懂。最后花了3个月重构,才把网关统一起来。

1.2 核心设计目标

统一网关到底要解决什么问题?我个人习惯从三个维度来思考:

维度 目标 说明
功能性 协议统一 对外提供一致的API接口,屏蔽交易所差异
可靠性 高可用 单点故障不影响整体,自动切换备用链路
性能 低延迟 订单处理延迟控制在微秒级,不成为瓶颈
可扩展 插件化 新增交易所只需开发对应插件,不改核心代码
可观测 全链路监控 每个环节的延迟、成功率、错误码都可追踪

说白了,统一网关要做的就一件事:让上层策略感觉不到交易所的存在。策略只需要说「我要买100个BTC」,至于这个订单走哪个交易所、用什么协议、怎么处理异常,都是网关的事。

避坑指南:我曾经犯过一个错误——把网关设计得太「智能」。比如自动拆单、自动路由、自动对冲。结果出了问题根本查不清是策略的问题还是网关的问题。后来我学乖了:网关只做接入,不做决策。所有业务逻辑都交给上层。

1.3 架构分层设计

统一网关的架构,我一般分成四层。你想想看,这就像一座桥——上层是策略,下层是交易所,网关就是中间的桥墩。

统一网关架构分层 第1层:策略接口层 统一API(下单、撤单、查询) | 数据订阅(行情、成交) 第2层:核心路由层 订单路由 | 协议转换 | 会话管理 | 流量控制 第3层:交易所适配层 交易所插件 | 协议适配 | 签名计算 | 连接管理 第4层:基础设施层 网络通信 | 序列化 | 日志 | 监控 | 配置管理 交易所A 交易所B 交易所C

第1层:策略接口层

这一层直接面对策略。我建议提供两套接口:

  • 同步API:下单、撤单、查询账户、查询持仓
  • 异步推送:行情数据、成交回报、账户变动

接口设计要尽量简洁。比如下单接口,就传三个参数:symbolsidequantity。至于这个订单走哪个交易所、用什么价格类型,由下层决定。

第2层:核心路由层

这是网关的大脑。它负责:

  • 订单路由:根据策略配置或动态规则,把订单发到合适的交易所
  • 协议转换:把统一的内部协议转成交易所特定的协议
  • 会话管理:维护与交易所的连接状态,处理心跳、重连
  • 流量控制:防止某个策略或交易所打爆系统

注意:路由层最容易出问题的地方是「状态管理」。比如一个订单在交易所A提交成功,但网关还没来得及返回给策略,这时候网关挂了怎么办?嗯,这里要引入「至少一次投递」和「幂等性」设计。后面我会专门讲这个。

第3层:交易所适配层

这一层是插件化的。每个交易所对应一个插件,插件负责:

  • 实现交易所的API协议(REST/WebSocket/FIX)
  • 计算签名(HMAC、RSA、Ed25519...)
  • 管理连接池和心跳
  • 解析交易所返回的数据

我习惯用C++写这一层,因为性能要求高。Python写上层逻辑,C++处理网络和序列化。这样既保证了开发效率,又保证了运行性能。

第4层:基础设施层

这一层提供公共服务:

  • 网络通信:基于epoll/io_uring的高性能网络框架
  • 序列化:Protobuf或FlatBuffers,比JSON快10倍以上
  • 日志:每个请求的完整链路日志,方便排查问题
  • 监控:延迟、吞吐量、错误率,全部上报到Prometheus
  • 配置管理:支持热更新,不用重启就能改配置

个人经验:基础设施层最容易被忽视的是「配置管理」。我曾经因为改了个交易所的API地址,忘了重启网关,结果订单全发到了旧地址。后来我强制要求所有配置都走配置中心,并且支持热加载。嗯,这个教训挺深刻的。

1.4 分层的好处

这么分层有什么好处?我总结三点:

  1. 职责清晰:每层只做自己的事,出了问题能快速定位
  2. 可替换性:想换掉某个交易所?只改适配层就行,上层完全不受影响
  3. 可测试性:每层都可以单独测试,不用启动整个系统

举个例子。我们之前要接入一个海外交易所,他们的API特别奇葩——用WebSocket发订单,用REST查状态。如果是以前,策略代码得改得面目全非。但现在,我们只需要写一个新的适配插件,把他们的奇葩协议转成内部统一协议。策略那边,一行代码都不用改。

这就是统一网关的价值。它把复杂留给自己,把简单留给别人。

核心思想:统一网关不是「加一层」,而是「抽象一层」。它把交易所的差异性封装起来,让上层策略只关心交易逻辑,不关心接入细节。


公众号:蓝海资料掘金营,微信deep3321