4. 消息队列选型:Kafka、RabbitMQ、Pulsar、RocketMQ对比

消息队列选型,说白了就是选一把趁手的兵器。我见过不少团队,上来就追新,结果被坑得够呛。也见过一些老项目,用着十几年前的MQ,吞吐量照样扛得住。

今天咱们就掰开揉碎,把Kafka、RabbitMQ、Pulsar、RocketMQ这四兄弟的底裤都扒干净。我会结合自己踩过的坑,给你一套能直接用的选型决策树。

4.1 吞吐量:谁才是真正的“吞”王?

吞吐量是消息队列的硬指标。我习惯用“每秒能处理多少条消息”来衡量,但这里有个坑——消息大小不同,结果天差地别。

消息队列 单机吞吐量(小消息) 单机吞吐量(大消息) 我的实测经验
Kafka 100万+/s 10万+/s 日志场景首选,磁盘顺序写太猛了
Pulsar 80万+/s 8万+/s 读写分离架构,存储层是BookKeeper
RocketMQ 50万+/s 5万+/s 阿里系,事务消息做得不错
RabbitMQ 5万+/s 1万+/s 适合小规模,别硬扛高吞吐

为什么会这样?Kafka和Pulsar都用了“零拷贝”技术,说白了就是数据从磁盘到网卡,不走用户态内存。我当年第一次调优Kafka时,看到CPU占用率不到20%,吞吐量却飙到80万,确实被震撼到了。

避坑指南:我曾经在日志采集场景硬上RabbitMQ,结果消息堆积到几百万,直接OOM。后来换成Kafka,同样的机器配置,吞吐量翻了20倍。

4.2 延迟:毫秒级 vs 微秒级

延迟是另一个维度的较量。你想想看,金融交易场景,延迟多1毫秒可能就亏几百万。

  • RabbitMQ:延迟最低,平均1-5ms。Erlang语言天生适合做消息路由,我见过它处理实时告警,延迟稳定在2ms以内。
  • Kafka:延迟10-50ms。因为要批量刷盘,吞吐优先。我习惯把acks设为1,延迟能降到10ms左右。
  • Pulsar:延迟5-20ms。分层架构导致多了一次网络跳转,但胜在弹性。
  • RocketMQ:延迟10-30ms。和Kafka类似,但同步刷盘模式下延迟会更高。

嗯,这里要注意:延迟和吞吐是跷跷板。你要低延迟,就得牺牲吞吐量。我一般建议:实时交易用RabbitMQ,日志采集用Kafka

4.3 持久化:数据安全怎么保证?

持久化机制决定了你的数据会不会丢。我见过最惨的一次,某团队用RabbitMQ没配镜像队列,节点挂了,几百万订单数据全丢了。

消息队列 持久化机制 数据可靠性 恢复速度
Kafka 磁盘顺序写 + 多副本 极高(ISR机制) 快(直接读磁盘)
Pulsar BookKeeper分段存储 极高(三副本) 快(自动恢复)
RocketMQ 同步/异步刷盘 高(同步刷盘不丢) 中(需重建索引)
RabbitMQ 队列持久化 + 消息持久化 中(单节点风险) 慢(需重建队列)

我个人习惯:核心业务数据必须用同步刷盘 + 多副本。Kafka的ISR(In-Sync Replicas)机制很靠谱,只要副本数大于1,数据基本不会丢。

警告:RabbitMQ的持久化有个坑——消息写入磁盘后,如果节点挂了,重启时重建队列可能耗时几分钟。我曾经在生产环境遇到过,重启后等了8分钟才恢复服务。

4.4 分区模型:水平扩展的关键

分区模型决定了你能扩展到多大。说白了,就是能不能加机器就提升性能。

  • Kafka:分区模型最成熟。每个Topic分成多个Partition,每个Partition内部有序。我习惯把分区数设为CPU核心数的2-3倍,这样能充分利用并行度。
  • Pulsar:分层架构,Topic和存储分离。分区数可以动态调整,不像Kafka那样需要重建Topic。我记得有一次线上需要扩容,Pulsar直接加分区就行,不用停服务。
  • RocketMQ:类似Kafka,但队列(Queue)是逻辑概念。支持顺序消息,但全局顺序需要单队列,吞吐会下降。
  • RabbitMQ:没有分区概念,靠Exchange路由。扩展性最差,单机扛不住就得加集群,但集群模式有脑裂风险。

你想想看,如果业务量从每天100万涨到1亿,Kafka和Pulsar加机器就行,RabbitMQ可能得重构架构。我建议:未来3年有增长预期的,直接上Kafka或Pulsar

4.5 选型决策树

说了这么多,到底怎么选?我总结了一套决策树,你照着走就行:

1. 需要低延迟(<5ms)?
   ├── 是 → RabbitMQ(实时交易、告警)
   └── 否 → 进入第2步

2. 需要超高吞吐(>50万/s)?
   ├── 是 → 进入第3步
   └── 否 → RocketMQ(适合中等规模)

3. 需要动态扩容?
   ├── 是 → Pulsar(云原生首选)
   └── 否 → Kafka(日志、流处理首选)

4. 需要事务消息?
   ├── 是 → RocketMQ(事务消息最成熟)
   └── 否 → 按上述规则选

我的建议:如果你是新项目,我推荐Pulsar。虽然学习曲线陡一点,但它的分层架构和动态扩容能力,能省掉未来很多重构的麻烦。我去年帮一个电商团队从Kafka迁移到Pulsar,扩容时再也不用半夜加班了。

4.6 知识体系总览

下面这张图,把四个消息队列的核心维度都串起来了。你可以保存下来,选型时对照着看:

消息队列选型知识体系 Kafka • 吞吐量:100万+/s(王者) • 延迟:10-50ms • 持久化:磁盘顺序写+ISR • 分区:成熟,静态分区 • 场景:日志、流处理 Pulsar • 吞吐量:80万+/s • 延迟:5-20ms • 持久化:BookKeeper三副本 • 分区:动态扩容,云原生 • 场景:云原生、多租户 RocketMQ • 吞吐量:50万+/s • 延迟:10-30ms • 持久化:同步/异步刷盘 • 分区:逻辑队列 • 场景:事务消息、电商 RabbitMQ • 吞吐量:5万+/s • 延迟:1-5ms(最低) • 持久化:队列+消息持久化 • 分区:无分区,Exchange路由 • 场景:实时交易、告警 选型

最后说一句:没有最好的消息队列,只有最合适的。我见过用Kafka做实时交易的,也见过用RabbitMQ扛日志的,结果都挺惨。选型时,先想清楚你的核心诉求——是吞吐、延迟、还是可靠性?想明白了,决策树走一遍,答案自然就出来了。


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