一、网关架构总览:为什么需要统一网关?核心设计目标与架构分层
做量化交易这些年,我见过太多团队在网关这块栽跟头。说实话,我自己早期也踩过不少坑。今天咱们就来聊聊,为什么非得搞个统一网关,它的核心目标是什么,架构又该怎么分层。
1.1 为什么需要统一网关?
先问个问题:你手上有几个交易所的API要对接?
我见过最夸张的情况,一个团队同时维护着6个交易所的接入代码。每个交易所的API风格都不一样——有的用REST,有的用WebSocket;有的返回JSON,有的返回Protobuf;有的限频100次/秒,有的限频10次/秒。更别提那些奇葩的签名算法和错误码了。
这会导致什么问题?
- 重复劳动:每个交易所都要写一套连接管理、心跳检测、重连逻辑
- 维护噩梦:交易所API一升级,所有接入代码都得跟着改
- 故障扩散:某个交易所的异常连接可能拖垮整个交易系统
- 策略耦合:策略代码里充斥着交易所特定的逻辑,想换个交易所?重写吧
核心痛点:没有统一网关,你的交易系统就像一团乱麻。每加一个交易所,复杂度就翻一倍。
我在项目中遇到过一家量化基金,他们最初就是每个交易所单独写接入。后来要接入第5个交易所时,整个技术团队崩溃了——因为之前的代码风格完全不统一,新来的工程师根本看不懂。最后花了3个月重构,才把网关统一起来。
1.2 核心设计目标
统一网关到底要解决什么问题?我个人习惯从三个维度来思考:
| 维度 | 目标 | 说明 |
|---|---|---|
| 功能性 | 协议统一 | 对外提供一致的API接口,屏蔽交易所差异 |
| 可靠性 | 高可用 | 单点故障不影响整体,自动切换备用链路 |
| 性能 | 低延迟 | 订单处理延迟控制在微秒级,不成为瓶颈 |
| 可扩展 | 插件化 | 新增交易所只需开发对应插件,不改核心代码 |
| 可观测 | 全链路监控 | 每个环节的延迟、成功率、错误码都可追踪 |
说白了,统一网关要做的就一件事:让上层策略感觉不到交易所的存在。策略只需要说「我要买100个BTC」,至于这个订单走哪个交易所、用什么协议、怎么处理异常,都是网关的事。
避坑指南:我曾经犯过一个错误——把网关设计得太「智能」。比如自动拆单、自动路由、自动对冲。结果出了问题根本查不清是策略的问题还是网关的问题。后来我学乖了:网关只做接入,不做决策。所有业务逻辑都交给上层。
1.3 架构分层设计
统一网关的架构,我一般分成四层。你想想看,这就像一座桥——上层是策略,下层是交易所,网关就是中间的桥墩。
第1层:策略接口层
这一层直接面对策略。我建议提供两套接口:
- 同步API:下单、撤单、查询账户、查询持仓
- 异步推送:行情数据、成交回报、账户变动
接口设计要尽量简洁。比如下单接口,就传三个参数:symbol、side、quantity。至于这个订单走哪个交易所、用什么价格类型,由下层决定。
第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 分层的好处
这么分层有什么好处?我总结三点:
- 职责清晰:每层只做自己的事,出了问题能快速定位
- 可替换性:想换掉某个交易所?只改适配层就行,上层完全不受影响
- 可测试性:每层都可以单独测试,不用启动整个系统
举个例子。我们之前要接入一个海外交易所,他们的API特别奇葩——用WebSocket发订单,用REST查状态。如果是以前,策略代码得改得面目全非。但现在,我们只需要写一个新的适配插件,把他们的奇葩协议转成内部统一协议。策略那边,一行代码都不用改。
这就是统一网关的价值。它把复杂留给自己,把简单留给别人。
核心思想:统一网关不是「加一层」,而是「抽象一层」。它把交易所的差异性封装起来,让上层策略只关心交易逻辑,不关心接入细节。
公众号:蓝海资料掘金营,微信deep3321