2. 系统总体架构设计:分层架构设计原则、微服务 vs 单体架构选型、核心模块划分

好,咱们直接进入正题。做市系统这东西,说白了就是跟时间赛跑。你想想看,行情数据每秒几千笔,你的系统要是慢个几毫秒,可能就被对手盘吃掉了。所以架构设计的第一原则,不是花里胡哨,而是稳、快、可扩展

2.1 分层架构设计原则

我个人习惯把做市系统拆成四层。为什么是四层?因为我在项目中吃过亏——一开始只分了三层,结果业务逻辑和行情处理搅在一起,改一个策略要重启整个系统,那叫一个痛苦。

核心分层:
  • 接入层:负责行情接入、订单路由、交易所协议转换
  • 核心层:做市策略引擎、风险管理、定价模型
  • 服务层:账户管理、资金核算、日志审计
  • 数据层:历史行情存储、策略回测、报表生成

每一层只做自己的事。接入层不关心你怎么定价,核心层不关心数据存哪里。这样改起来才爽——比如换一个交易所接口,只动接入层,其他层完全不动。

我的经验: 分层时一定要定义好层与层之间的接口协议。我曾经因为接口协议没定死,结果接入层和核心层各用各的字段名,联调时改了一周。血的教训。

2.2 微服务 vs 单体架构选型

这个问题我经常被问到。其实没有绝对的好坏,关键看你的场景。

维度 单体架构 微服务架构
开发速度 初期快,后期慢 初期慢,后期快
部署复杂度 低,一个包搞定 高,需要容器编排
故障隔离 差,一个模块挂了全挂 好,单个服务挂了不影响其他
扩展性 只能整体扩展 可以按需扩展
适合场景 团队小、业务简单 团队大、业务复杂

我个人建议:做市系统初期用单体就够了。为什么?因为做市的核心逻辑就那么几个模块,微服务带来的网络延迟和运维成本,对高频场景来说是致命的。我见过一个团队,一上来就搞了十几个微服务,结果行情处理链路多了好几毫秒,策略根本跑不赢。

避坑指南: 我曾经见过一个项目,为了“微服务而微服务”,把行情处理和策略引擎拆成两个服务。结果行情数据要通过网络传输,延迟从微秒级变成了毫秒级。做市系统里,毫秒就是钱啊。

但如果你做的是多市场、多品种的做市,比如同时做美股、A股、期货,那微服务就有优势了——每个市场独立部署,互不影响。这时候我会建议用微服务,但核心的行情处理和策略引擎一定要放在同一个进程里。

2.3 核心模块划分

好了,咱们来看看做市系统到底要拆成哪些模块。我按功能把它们分成几组:

2.3.1 行情模块

  • 行情接入:对接交易所的行情源,支持多种协议(FIX、UDP、WebSocket)
  • 行情缓存:本地维护一个快照,避免每次都去查数据库
  • 行情分发:把处理好的行情推给策略引擎和其他模块

这里要注意,行情模块是系统的入口,它的性能直接决定了整个系统的延迟。我一般会用C++或者Rust来写行情接入层,Java写上层逻辑。

2.3.2 策略引擎模块

  • 定价模型:计算期权的理论价格,常用的有Black-Scholes、二叉树、蒙特卡洛
  • 做市策略:根据定价结果生成买卖报价,比如Delta中性策略、Gamma scalping
  • 订单管理:管理已发出的订单,处理撤单、改单
核心逻辑: 策略引擎是大脑,它决定了你报什么价、报多少量。我见过很多团队把定价和策略写在一起,结果改一个定价参数要重新编译整个策略。建议把定价模型独立出来,做成可配置的。

2.3.3 风控模块

  • 实时风控:检查每笔报价是否超出风险限额,比如最大持仓、最大敞口
  • 事前风控:在报价发出前检查,比如价格是否合理、是否超过涨跌停
  • 事后风控:成交后检查,比如是否出现异常交易

嗯,这里要特别强调一下。风控模块必须独立于策略引擎,而且要有独立的进程。为什么?因为策略引擎可能会出bug,如果风控和策略在同一个进程里,策略挂了风控也挂了,那就没人拦着系统乱报价了。我曾经就遇到过策略死循环,结果风控模块因为共享内存被锁住,也跟着挂了,最后爆仓了。从那以后,我坚持风控必须独立部署。

2.3.4 数据与监控模块

  • 日志系统:记录所有交易日志,用于事后分析
  • 监控告警:监控系统状态,比如延迟、吞吐量、错误率
  • 回测系统:用历史数据验证策略效果

这些模块虽然不直接参与交易,但少了它们,你就像在黑暗中开车。我习惯把监控做成实时仪表盘,延迟、报价次数、成交率一目了然。

2.4 架构图:核心模块与数据流

下面这张图展示了做市系统的核心模块和数据流向。我画的是简化版,但核心逻辑都在里面了。

期权做市系统核心架构图 行情接入 交易所协议解析 行情缓存 本地快照维护 策略引擎 定价模型 + 做市策略 订单生成 风控模块 实时风控 + 事前风控 限额检查 行情推送 报价检查 订单路由 交易所订单发送 通过检查 数据与监控 日志 + 监控 + 回测 接入层 数据层 核心层 风控层 服务层 监控层

从图上你能看到,行情从交易所进来,经过缓存后推给策略引擎。策略引擎生成报价后,先过风控模块,风控通过了才发到订单路由,最后送到交易所。所有模块的数据都会汇总到数据与监控模块,方便你事后分析。

我的建议: 实际部署时,行情缓存、策略引擎、风控模块这三个最好放在同一台机器上,用共享内存通信。这样可以避免网络延迟。订单路由可以单独部署,因为它需要跟交易所通信,可能会有网络抖动。

好了,这一章的内容就这些。记住,架构设计没有银弹,关键是根据你的业务场景做取舍。下一章我们会深入策略引擎的设计,聊聊定价模型和做市策略的具体实现。


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