第24章:做市系统架构设计

做市系统,说白了就是一台印钞机——前提是你得把它造稳了。我见过太多团队,策略牛逼哄哄,结果系统一上线就崩,最后亏得底裤都不剩。今天咱们聊聊架构设计里的几个核心问题:微服务怎么拆、消息队列选哪个、数据库用什么、灾备怎么做。

一、微服务架构:别把鸡蛋放一个篮子里

我个人习惯把做市系统拆成这么几个服务:

  • 行情接入服务:负责接收交易所的实时行情,做数据清洗和归一化
  • 策略引擎服务:跑你的做市算法,计算报价和风险敞口
  • 订单管理服务:管理订单生命周期,包括撤单、重发、状态同步
  • 风控服务:独立于策略之外,做硬性风控检查
  • 数据存储服务:负责把行情、订单、成交数据写入数据库

为什么要拆?我在项目中遇到过一件事:有一次行情数据量突然暴增,行情接入服务扛不住了,结果整个系统都卡死。如果当时拆开了,至少策略引擎还能继续跑,只是行情更新慢一点而已。

核心原则:每个服务独立部署、独立扩容、独立故障。一个挂了,不影响其他。

二、消息队列:ZeroMQ vs Kafka

消息队列是做市系统的血管。选错了,血流不畅,系统就废了。

特性 ZeroMQ Kafka
延迟 微秒级 毫秒级
吞吐量 中等 极高
持久化
适用场景 实时行情推送 订单日志、历史数据

我建议这样搭配:

  • 行情数据用ZeroMQ:延迟低,丢几条行情无所谓,策略能接受
  • 订单和成交数据用Kafka:必须保证不丢,而且方便回放和审计

我曾经犯过一个错:把所有数据都塞进Kafka,结果行情延迟从微秒级变成了毫秒级,策略报价跟不上市场变化。后来改成ZeroMQ推行情,Kafka只存日志,问题就解决了。

避坑指南:ZeroMQ没有broker,每个节点直连。Kafka有broker,适合做数据总线。别搞混了。

三、数据库选型:时序数据库是王道

做市系统产生的数据,90%以上是时序数据——行情、订单、成交、持仓变化。用传统关系型数据库存这些,你会后悔的。

我推荐用 InfluxDBTimescaleDB

  • 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(订单/成交日志) 风控服务 数据存储服务 InfluxDB / TimescaleDB 灾备管理 Redis(状态快照) 做市系统微服务架构图 行情走ZeroMQ,订单走Kafka,状态存Redis,数据落时序库

这张图里,行情数据走ZeroMQ直推策略引擎,延迟最低。订单和成交数据走Kafka,方便回放和审计。风控服务独立部署,可以随时切断订单管理服务的输出。灾备管理监控所有服务的健康状态,一旦发现主服务挂了,立刻切换到备机。

个人经验:别把架构搞得太复杂。我见过有人拆了十几个微服务,结果每次上线都要协调半天。做市系统追求的是稳定和低延迟,适度拆分就好,别过度设计。

好了,关于做市系统架构设计,今天就聊这么多。记住一句话:架构是为业务服务的,不是用来炫技的。你的系统能稳定跑一年不出事,比什么都强。


无相订单流研究社 微信Lucian808555