第24章:做市系统架构设计
做市系统,说白了就是一台印钞机——前提是你得把它造稳了。我见过太多团队,策略牛逼哄哄,结果系统一上线就崩,最后亏得底裤都不剩。今天咱们聊聊架构设计里的几个核心问题:微服务怎么拆、消息队列选哪个、数据库用什么、灾备怎么做。
一、微服务架构:别把鸡蛋放一个篮子里
我个人习惯把做市系统拆成这么几个服务:
- 行情接入服务:负责接收交易所的实时行情,做数据清洗和归一化
- 策略引擎服务:跑你的做市算法,计算报价和风险敞口
- 订单管理服务:管理订单生命周期,包括撤单、重发、状态同步
- 风控服务:独立于策略之外,做硬性风控检查
- 数据存储服务:负责把行情、订单、成交数据写入数据库
为什么要拆?我在项目中遇到过一件事:有一次行情数据量突然暴增,行情接入服务扛不住了,结果整个系统都卡死。如果当时拆开了,至少策略引擎还能继续跑,只是行情更新慢一点而已。
核心原则:每个服务独立部署、独立扩容、独立故障。一个挂了,不影响其他。
二、消息队列:ZeroMQ vs Kafka
消息队列是做市系统的血管。选错了,血流不畅,系统就废了。
| 特性 | ZeroMQ | Kafka |
|---|---|---|
| 延迟 | 微秒级 | 毫秒级 |
| 吞吐量 | 中等 | 极高 |
| 持久化 | 无 | 有 |
| 适用场景 | 实时行情推送 | 订单日志、历史数据 |
我建议这样搭配:
- 行情数据用ZeroMQ:延迟低,丢几条行情无所谓,策略能接受
- 订单和成交数据用Kafka:必须保证不丢,而且方便回放和审计
我曾经犯过一个错:把所有数据都塞进Kafka,结果行情延迟从微秒级变成了毫秒级,策略报价跟不上市场变化。后来改成ZeroMQ推行情,Kafka只存日志,问题就解决了。
避坑指南:ZeroMQ没有broker,每个节点直连。Kafka有broker,适合做数据总线。别搞混了。
三、数据库选型:时序数据库是王道
做市系统产生的数据,90%以上是时序数据——行情、订单、成交、持仓变化。用传统关系型数据库存这些,你会后悔的。
我推荐用 InfluxDB 或 TimescaleDB:
- InfluxDB:纯时序数据库,写入快,查询快,适合高频行情存储
- TimescaleDB:基于PostgreSQL,支持SQL,适合需要复杂查询的场景
举个例子,存行情数据:
-- InfluxDB写入示例(行协议)
market_data,symbol=BTCUSDT,exchange=binance price=50000.0,volume=1.5 1620000000000000000
-- TimescaleDB建表
CREATE TABLE market_data (
time TIMESTAMPTZ NOT NULL,
symbol TEXT NOT NULL,
price DOUBLE PRECISION,
volume DOUBLE PRECISION
);
SELECT create_hypertable('market_data', 'time');
嗯,这里要注意:时序数据库的压缩率很高,InfluxDB能压到原始数据的1/10。我有个项目,每天产生500GB的行情数据,用InfluxDB存下来只要50GB,省了不少钱。
警告:别用MongoDB存高频行情。写入锁竞争会让你欲哭无泪。我试过,后来全换了。
四、灾备方案:别等出事了再想
做市系统最怕什么?怕交易所断连、怕服务器宕机、怕网络抖动。我见过最惨的一次:某团队主服务器挂了,备机没及时切换,结果策略空跑了一分钟,亏了200万。
我的灾备方案是这样的:
- 主备切换:主服务器和备服务器部署在不同机房,用Keepalived做VIP漂移
- 数据同步:Kafka自带副本机制,时序数据库用双写或异步复制
- 策略状态快照:每5秒把策略状态(持仓、订单、参数)写入Redis,备机启动时从Redis恢复
- 人工干预通道:保留一个独立的Web界面,可以手动停止策略、撤单、平仓
我曾经在备机切换时踩过一个坑:Redis里的状态快照是5秒前的,切换后策略以为还有某个订单,实际上那个订单已经成交了。后来我改成每笔成交都实时更新Redis,才彻底解决。
核心原则:灾备不是备份数据,是备份「能继续赚钱的能力」。数据丢了可以补,行情错过了就没了。
五、整体架构图
下面这张图是我个人比较喜欢的一种架构风格,你可以参考:
这张图里,行情数据走ZeroMQ直推策略引擎,延迟最低。订单和成交数据走Kafka,方便回放和审计。风控服务独立部署,可以随时切断订单管理服务的输出。灾备管理监控所有服务的健康状态,一旦发现主服务挂了,立刻切换到备机。
个人经验:别把架构搞得太复杂。我见过有人拆了十几个微服务,结果每次上线都要协调半天。做市系统追求的是稳定和低延迟,适度拆分就好,别过度设计。
好了,关于做市系统架构设计,今天就聊这么多。记住一句话:架构是为业务服务的,不是用来炫技的。你的系统能稳定跑一年不出事,比什么都强。
无相订单流研究社 微信Lucian808555