系统架构总览:分层架构设计
做量化做市系统,第一件事不是写代码,而是想清楚架构。我见过太多团队,一上来就撸策略代码,结果数据流乱成一锅粥,订单发不出去,成交回报对不上。嗯,这就是典型的「地基没打好」。
今天咱们聊聊系统架构的总览。说白了,就是怎么把一个大系统拆成几块,每块干什么活,块与块之间怎么通信。
一、分层架构设计:数据层、策略层、执行层
我个人习惯把做市系统分成三层:数据层、策略层、执行层。为什么是三层?你想想看,做市的核心流程就是:拿数据 → 算价格 → 发订单。这三件事的节奏完全不同,硬塞在一起会出问题。
核心原则:每一层只关心自己的事,不越界。数据层只管数据清洗和缓存,策略层只管定价和信号,执行层只管订单管理和风控。
1. 数据层(Data Layer)
数据层是系统的「眼睛」。它负责从交易所接收行情、从数据库拉取历史数据、从外部API获取参考数据。
我在项目中遇到过一个问题:行情数据来了,策略层直接去解析,结果行情一波动,策略层CPU被打满,订单都发不出去。后来我们把数据层独立出来,用环形缓冲区做数据缓存,策略层只管读,不管收。
- 行情接入:WebSocket/FIX协议,多路复用
- 数据清洗:去重、补全、时间对齐
- 数据缓存:内存数据库(Redis)或环形缓冲区
- 历史数据:ClickHouse/InfluxDB,用于回测和分析
2. 策略层(Strategy Layer)
策略层是系统的「大脑」。它根据数据层提供的行情,计算做市报价、管理库存风险、生成交易信号。
这里有个坑:策略层不要直接操作订单。我曾经见过一个策略,算完价格直接调用交易所API发单,结果网络延迟导致重复下单,亏了不少。策略层只输出「信号」,执行层负责「干活」。
- 定价引擎:计算买卖报价(Spread、Mid Price)
- 库存管理:控制持仓风险,避免单边暴露
- 信号生成:基于市场微观结构、订单簿不平衡等
- 回测框架:离线验证策略有效性
3. 执行层(Execution Layer)
执行层是系统的「手脚」。它接收策略层的信号,负责发单、撤单、管理订单生命周期。
执行层最怕什么?怕订单卡住。我记得有一次,交易所网关挂了,执行层还在不断重发订单,结果交易所恢复后,一堆重复订单飞出去。后来我们加了「订单状态机」,每个订单都有明确的状态流转,超时自动熔断。
- 订单管理:创建、修改、撤销、查询
- 路由管理:支持多交易所、多账户
- 风控检查:资金检查、频率限制、价格偏离
- 成交回报:实时推送成交信息到策略层
我的建议:三层之间用消息队列(如Kafka、NATS)通信,不要直接RPC调用。这样即使某一层挂了,其他层还能继续工作。数据层挂了,策略层还能用缓存数据撑一会儿。
二、微服务 vs 单体架构的选择
这个问题我经常被问到。很多新手一上来就说「我们要用微服务」,结果搞了一堆服务,运维成本比开发成本还高。
我的观点很简单:看规模,看团队。
| 维度 | 单体架构 | 微服务架构 |
|---|---|---|
| 开发速度 | 快,适合小团队 | 慢,需要基础设施 |
| 部署复杂度 | 低,一个包搞定 | 高,需要容器编排 |
| 扩展性 | 整体扩展,资源浪费 | 按需扩展,灵活 |
| 故障隔离 | 一个bug拖垮全部 | 单个服务故障不影响全局 |
| 运维成本 | 低 | 高,需要监控、日志、链路追踪 |
我个人习惯:初期用单体,后期拆微服务。做市系统对延迟敏感,微服务之间的网络通信会引入额外延迟。如果你只有一两个交易所,一个策略,单体架构完全够用。
什么时候拆?当你发现:
- 数据层和策略层的负载差异太大(数据层需要高吞吐,策略层需要低延迟)
- 需要支持多个策略同时运行,且互不干扰
- 团队扩大到5人以上,需要独立部署和迭代
避坑指南:我曾经见过一个团队,一开始就搞了10个微服务,结果每次上线都要协调半天,一个服务升级导致其他服务不兼容。记住:微服务不是银弹,它解决的是「组织复杂度」,不是「技术复杂度」。
三、核心模块划分
不管用单体还是微服务,核心模块是固定的。我习惯把系统分成以下几个模块:
- 行情模块(Market Data):负责行情接入、解析、分发。支持多交易所、多品种。
- 策略引擎(Strategy Engine):加载策略、管理策略生命周期、执行策略逻辑。
- 订单管理(Order Manager):订单状态机、订单路由、成交回报处理。
- 风控模块(Risk Control):资金风控、频率风控、价格风控、持仓风控。
- 账户模块(Account Manager):管理交易所账户、API Key、资金余额。
- 监控模块(Monitoring):系统指标、告警、日志、链路追踪。
- 数据存储(Data Storage):行情数据、交易数据、策略参数、系统配置。
下面这张图展示了各模块之间的关系:
这张图里,数据层负责从交易所拿数据,经过清洗后推给策略层。策略层算出信号,交给执行层发单。执行层把订单发到交易所,成交回报再通过数据层反馈回来。整个流程是闭环的。
我的经验:模块之间一定要定义清晰的接口。比如行情模块输出的数据结构,策略层怎么消费,这些都要提前约定好。否则后期改接口,牵一发而动全身。
最后说一句:架构设计没有标准答案。你团队有3个人,用单体;有30个人,拆微服务。关键是别过度设计。我见过太多系统,还没跑起来,先被架构搞死了。
嗯,今天就聊这么多。记住:数据层要稳,策略层要准,执行层要快。这三层配合好了,做市系统就成功了一半。