一、量化消息中间件概述

大家好,我是老张。在量化系统里摸爬滚打十几年,今天跟大伙聊聊消息中间件。

先问个问题:你的量化系统里,数据是怎么流动的?

行情数据从交易所进来,经过处理,送到策略模块,策略算出信号,再发给交易执行模块。这中间每一步都可能出问题——数据丢了、延迟高了、系统崩了。消息中间件,就是来解决这些问题的。

消息中间件在量化系统中的作用

说白了,消息中间件就是个「数据快递员」。但它不是普通快递,是那种「使命必达」的顶级快递。

我总结下来,它在量化系统里干四件事:

  • 解耦:行情模块和策略模块不用直接通信。行情模块只管发数据,策略模块只管收数据。谁挂了都不影响对方。我在2018年做过一个项目,行情模块重构了三次,策略模块一次都没改过——这就是解耦的好处。
  • 削峰填谷:开盘那几分钟,行情数据像洪水一样涌进来。如果没有中间件缓冲,策略模块直接就被冲垮了。消息中间件像个大水池,先把数据存起来,让策略模块慢慢处理。
  • 异步处理:策略算出信号后,不需要等交易模块确认。发个消息就走,继续算下一个信号。这能大幅提升吞吐量。
  • 可靠传输:网络断了、机器重启了,消息不能丢。好的中间件能保证「消息不丢、不重、不乱序」。

核心观点:量化系统的核心是「快」和「准」。消息中间件就是保证「快」和「准」的基础设施。没有它,你的系统就像没有地基的高楼。

主流消息中间件对比

现在市面上主流的消息中间件有三个:RabbitMQ、Kafka、Pulsar。每个我都用过,踩过不少坑。

特性 RabbitMQ Kafka Pulsar
定位 传统消息队列 分布式流平台 下一代消息流平台
协议 AMQP 0-9-1 自定义协议 自定义协议 + Kafka兼容
存储 内存/磁盘 磁盘(顺序写) 计算存储分离
延迟 微秒级 毫秒级 毫秒级
吞吐量 万级/秒 百万级/秒 百万级/秒
消息顺序 单队列有序 分区内有序 分区内有序
消息回溯 不支持 支持(按offset) 支持(按时间/位置)
运维复杂度

这张表我建议你收藏。选型的时候拿出来对照一下。

RabbitMQ

RabbitMQ 是我最早用的消息中间件。它的优点是简单、稳定、延迟低。

适合什么场景?订单路由、风控通知、小规模行情分发。我有个朋友做期权做市,就用 RabbitMQ 做订单路由,延迟控制在 50 微秒以内,非常稳。

但它的缺点也很明显:吞吐量上不去。到了每秒几万条消息就开始吃力。而且不支持消息回溯——消息消费完就没了,想重新处理?没门。

个人经验:如果你团队小、系统简单、对延迟要求极高,选 RabbitMQ 没错。但别指望它能扛住百万级并发。

Kafka

Kafka 是量化系统里的「标配」。为什么?因为它就是为高吞吐量设计的。

Kafka 的核心设计是「顺序写磁盘」。你想想看,普通数据库写磁盘是随机写,慢得要死。Kafka 把数据追加到文件末尾,速度接近内存写。这就是它能扛百万级吞吐的秘密。

我在2019年做一个高频交易系统,行情数据每秒 50 万条。用 Kafka 轻松搞定。但要注意,Kafka 的延迟比 RabbitMQ 高,一般在 2-10 毫秒。做高频交易的朋友要注意这个。

Kafka 还有一个杀手锏:消息回溯。你可以指定从某个时间点重新消费。这在回测和故障排查时特别有用。我曾经因为策略 bug 导致亏损,靠 Kafka 的消息回溯把历史数据重新跑了一遍,找到了问题根源。

避坑指南:Kafka 的消费者组设计很灵活,但也容易踩坑。我曾经遇到过消费者组 rebalance 导致系统抖动的问题。解决方案是控制消费者数量,不要频繁增减。

Pulsar

Pulsar 是后起之秀。它吸收了 Kafka 的优点,又解决了 Kafka 的一些痛点。

最大的亮点是「计算存储分离」。Kafka 的存储和计算是绑在一起的,扩容很麻烦。Pulsar 把存储层独立出来,用 BookKeeper 存数据,Broker 只负责计算。扩容时只需要加 Broker 节点,数据自动均衡。

Pulsar 还支持「多租户」和「分层存储」。热数据放 SSD,冷数据放 HDD 或云存储。这在量化系统里很实用——历史行情数据可以存到廉价存储上,节省成本。

但 Pulsar 的运维复杂度确实高。我去年帮一家私募搭建 Pulsar 集群,光是 BookKeeper 的配置就折腾了两周。小团队慎用。

选型考量

说了这么多,到底怎么选?我给出四个考量维度:

  1. 吞吐量需求:每秒几万条?选 RabbitMQ。每秒几十万条以上?选 Kafka 或 Pulsar。
  2. 延迟要求:微秒级?RabbitMQ。毫秒级?Kafka 或 Pulsar。
  3. 团队能力:运维能力弱?RabbitMQ。有专业运维?Kafka。想玩点新东西?Pulsar。
  4. 功能需求:需要消息回溯?Kafka 或 Pulsar。需要复杂路由?RabbitMQ。

我的建议:如果你刚开始做量化系统,从 Kafka 入手。社区成熟、资料多、坑少。等团队大了、需求复杂了,再考虑 Pulsar。

知识体系结构图

下面这张图展示了消息中间件在量化系统中的位置和选型逻辑:

量化消息中间件知识体系 数据源 行情/订单/风控 消息中间件 解耦 · 削峰填谷 · 异步 · 可靠传输 RabbitMQ Kafka Pulsar 低延迟 · 简单 · 万级吞吐 高吞吐 · 消息回溯 · 成熟 计算存储分离 · 多租户 选型考量 吞吐量 → 延迟 → 团队能力 → 功能需求 量化系统应用

这张图把整个知识体系串起来了。从数据源到消息中间件,再到三种主流产品的对比,最后落到选型考量。你照着这个思路去理解,就不会乱。

最后说一句:选型没有银弹。每个团队、每个系统都有自己的特点。我的建议是:先搞清楚自己的需求,再去看产品。别为了用新技术而用新技术。


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