摘要
本文以承恒AI量化交易平台为例,论述分布式系统架构设计在金融量化交易领域的实践。该平台面向个人投资者与小型机构,提供AI驱动的策略生成、回测验证、实盘交易与风险监控的全闭环服务。2025年8月,我作为系统架构设计师,负责该平台的整体架构设计工作。本文从五层架构设计、微服务拆分、多模数据存储分层、事件驱动通信、多租户数据隔离及高可用容灾六个方面,阐述分布式架构设计方案的落地过程。实践表明,通过合理的服务拆分与数据分层,平台实现了行情数据峰值每秒数十万条Tick的实时处理,13个微服务独立部署与水平扩展,PostgreSQL行级安全策略保障了多用户数据隔离,K8s跨可用区部署实现99.9%可用性。最终系统在8周内完成MVP上线,支撑了首期500用户的量化交易需求。
正文
一、项目背景
随着人工智能与量化投资的深度融合,传统量化交易平台正面临从"代码驱动"向"AI驱动"的范式转变。当前主流量化平台在策略回测和因子研究方面已较为成熟,但在AI自动化决策、多用户隔离的实时交易执行、以及低门槛策略定制方面仍存在明显缺口。2025年8月,我所在团队承接了承恒AI量化交易平台的开发任务,该平台面向个人投资者与小型机构,核心创新在于引入AI模板引擎,用户无需编写代码即可通过自然语言描述生成量化策略,平台基于AI模型自动实现交易决策,并对接券商接口实现实时交易执行。
作为系统架构设计师,我负责整体架构设计、微服务拆分、数据库设计和部署架构工作。平台需要在保证金融级数据一致性的前提下,处理A股交易时段5000余只股票的实时行情推送(峰值每秒数十万条Tick数据),同时支撑多用户并发的策略执行、回测计算和实时交易,对分布式架构设计提出了极高要求。
二、分布式架构总体设计
我采用前后端分离的微服务架构,将系统分为五层:用户接入层、业务服务层、AI决策引擎层、数据服务层和交易执行层。各层之间通过API网关和消息队列解耦。用户接入层包含React 18前端、APISIX网关和JWT认证模块;业务服务层基于Python FastAPI构建,承载用户管理、策略管理、组合管理和回测服务;AI决策引擎层负责LLM策略解析、XGBoost与LSTM价格预测和规则引擎决策;数据服务层管理行情数据和因子库的存储与分发;交易执行层通过QMT SDK对接券商接口。
在五层架构基础上,我将系统拆分为13个微服务,涵盖认证、用户、策略、行情、回测、AI引擎、信号、交易、组合、监控、资讯、通知和调度等业务域。服务拆分遵循单一职责、数据独占和独立部署三个原则:每个服务负责一个业务域,独占其数据库表,其他服务通过API访问而非跨库直读。这一拆分使各服务能按自身负载特征独立扩展------AI引擎服务作为计算密集型,可根据消息积压量自动扩容2至6个副本,而行情服务作为IO密集型,可按吞吐量水平扩展。
三、多模数据存储分层设计
量化交易平台的数据具有鲜明的多模态特征:既有需要强事务一致性的用户和交易数据,又有海量时序行情数据,还有全文检索需求和文件存储需求。单一数据库无法满足所有场景,我设计了六层存储架构。
PostgreSQL 16作为核心关系型数据库,存储用户信息、策略配置、交易记录和组合数据。选择PostgreSQL而非MySQL,基于三方面考量:numeric类型保障金融精度,避免浮点误差;MVCC机制实现高并发读写不阻塞;JSONB类型配合GIN索引支持策略配置等半结构化数据的高效检索。TimescaleDB作为PostgreSQL扩展,存储日线和分钟线行情数据,自动按时间分区(每7天一个chunk),90天前的数据自动压缩,压缩比约10比1。ClickHouse专职处理Tick级海量行情数据,数据量达数百亿行,采用MergeTree引擎按天分区,物化视图按分钟聚合Tick数据后同步至TimescaleDB。此外,Redis缓存实时行情快照,Elasticsearch存储新闻舆情全文,MinIO保存回测结果文件。数据流向设计为:行情数据源经market-data-service写入Redis和Kafka,再分别落盘至ClickHouse和TimescaleDB,ClickHouse中的Tick数据通过聚合任务生成分钟线同步至TimescaleDB。这一分层设计使各存储组件各司其职,避免了单一数据库的性能瓶颈。
四、事件驱动通信与服务间协作
13个微服务间的通信采用同步与异步结合的混合模式。同步场景使用gRPC,适用于低延迟、需要即时响应的调用;异步场景使用Kafka消息队列,适用于解耦、削峰和事件驱动场景。我设计了7个核心Kafka Topic:market.tick(实时Tick行情,按股票代码hash分区,32分区)、signal.generated(交易信号,按用户ID hash分区)、order.lifecycle(订单状态变更)、trade.executed(成交回报)和risk.alert(风险预警)等。分区策略遵循相同key的消息进入同一分区的原则,行情数据按股票代码分区保证Tick有序,交易信号按用户ID分区保证同一用户的信号有序处理。
以AI自动交易的完整数据流为例:market-data-service通过QMT SDK接收实时Tick数据,写入Redis并发布到Kafka;ai-engine-service消费行情数据,结合TimescaleDB历史数据计算技术指标特征,输入XGBoost和LSTM模型预测涨跌概率,同时将新闻文本输入LLM获取市场情绪评分;规则引擎综合ML预测、LLM研判和用户策略配置生成交易决策;信号经风控预检后发布到Kafka;signal-service执行事前风控检查,trade-service通过QMT SDK下单,订单状态变更发布到Kafka供组合服务和监控服务消费。整个链路全程异步,避免了同步调用链导致的延迟累积。
五、多租户数据隔离
平台面向多用户,每个用户拥有独立的策略空间、数据沙箱和交易账户,数据隔离是硬性要求。我设计了三层隔离机制:在PostgreSQL层面,在users、strategies、orders、positions等表上启用行级安全策略(RLS),强制添加WHERE user_id等于当前用户ID的过滤条件;在Kafka层面,每个用户的策略运行在独立消费者组中,信号消息按user_id分区;在Redis层面,所有用户级缓存Key以user_id为前缀。此外,API网关上配置路由级RBAC,不同角色可访问不同API。三层隔离从数据库、消息队列到缓存全覆盖,确保了多用户环境下的数据安全。
六、高可用与容灾设计
系统部署在Kubernetes集群上,跨2个可用区部署,Pod反亲和确保同一服务的副本分布在不同可用区。13个微服务均为无状态设计,支持K8s HPA自动扩缩容。有状态组件采用集群模式:PostgreSQL主从复制(1主2从)实现读写分离;ClickHouse分片集群(2 Shard乘2 Replica)加ZooKeeper协调;Redis主从加Sentinel哨兵自动故障切换;Kafka 3节点Broker集群,副本数为3。灾备方面,PostgreSQL每日全量备份加WAL连续归档(RPO小于1分钟),Redis采用AOF加RDB双持久化。整体RTO小于30分钟,RPO小于5分钟。服务间调用配置熔断器,故障时降级而非级联失败,配合APISIX金丝雀路由实现灰度发布。
七、遇到的问题与解决方法
在架构落地过程中,我遇到并解决了以下关键问题。第一,高并发行情写入瓶颈。峰值每秒数十万条Tick数据若逐条写入ClickHouse会造成严重性能问题,我将写入改为批量模式(每1000条或每2秒flush一次),配合Kafka 32分区并行消费,使吞吐量提升约5倍。第二,交易幂等性保障。网络重试可能导致重复下单,我在orders表上增加order_uuid唯一约束,重复请求因唯一约束被拦截,实现了幂等控制。第三,多租户RLS性能开销。RLS在每条查询上附加WHERE条件,高频查询时存在性能损耗,我通过在user_id上建索引、将高频读操作走Redis缓存的方式,将数据库压力降至可接受范围。第四,多存储数据一致性问题。行情数据需同时写入Redis、ClickHouse和TimescaleDB,我采用Kafka作为数据分发的统一管道,各存储的写入由独立消费者异步完成,通过消费位移管理实现最终一致性。
八、总结
承恒AI量化交易平台的分布式架构设计实践表明,微服务拆分使各业务域独立演进,多模数据存储分层使不同特征的数据各得其所,事件驱动通信实现了服务间的松耦合与高吞吐,多租户隔离机制保障了用户数据安全,K8s跨可用区部署实现了高可用。系统在8周内完成MVP上线,首期支撑500用户的核心交易闭环。后续将根据用户增长逐步引入完整的TDD架构,包括Kafka集群扩展和跨地域灾备,以支撑更大规模的量化交易需求。