不同的消息队列有什么区别?Kafka、RabbitMQ、RocketMQ、Pulsar、ActiveMQ 选型对比

不同的消息队列有什么区别?Kafka、RabbitMQ、RocketMQ、Pulsar、ActiveMQ 选型对比

在后端开发中,只要系统规模稍微大一些,就很容易遇到消息队列(Message Queue,简称 MQ)。

例如:

  • 用户下单后异步发送短信
  • 支付成功后通知积分、库存、物流系统
  • 将日志发送到大数据平台
  • 秒杀流量削峰
  • 服务之间异步解耦
  • 延迟关闭未支付订单

很多刚接触消息队列的人会有一个疑问:

Kafka、RabbitMQ、RocketMQ、Pulsar、ActiveMQ 都是消息队列,它们到底有什么区别?

它们都能完成"发送消息、存储消息、消费消息"这件事,但设计目标并不完全相同。

有的更偏向高吞吐事件流 ,有的更偏向业务消息和复杂路由 ,有的专门强化了顺序消息、延迟消息、事务消息 ,还有的更偏向云原生和多租户场景

这篇文章就把这些常见 MQ 一次讲清楚。


一、消息队列到底解决什么问题?

在比较不同 MQ 之前,先理解为什么需要消息队列。

假设现在有一个订单服务,用户支付成功后需要执行:

  1. 扣减库存
  2. 增加积分
  3. 发送短信
  4. 通知物流
  5. 写入数据分析系统

如果订单服务同步调用所有系统,那么其中任何一个服务变慢,都可能拖慢整个支付流程。

加入消息队列以后,可以变成:

text 复制代码
订单服务 -> 消息队列 -> 库存服务
                    -> 积分服务
                    -> 短信服务
                    -> 物流服务

订单服务只需要把"订单支付成功"这个事件发送出去,后面的服务自己消费消息。

这就是消息队列最常见的几个作用。

1. 异步

原本需要同步等待的操作,可以交给消费者异步完成。

例如发送短信并不是支付接口必须立即完成的事情,因此可以异步执行。

2. 解耦

订单服务不需要知道积分服务、短信服务和物流服务的具体实现。

只要发布一条消息即可。

以后增加新的消费者,也不一定需要修改订单服务。

3. 削峰

假设秒杀活动瞬间产生大量请求,数据库无法同时处理。

可以先把请求放入消息队列,再让消费者按照系统能够承受的速度逐步处理。


二、常见消息队列有哪些?

目前后端开发中经常会遇到:

  • Kafka
  • RabbitMQ
  • RocketMQ
  • Pulsar
  • ActiveMQ

先看一张整体定位图。

可以先记一个非常粗略的结论:

消息队列 更擅长的方向
Kafka 高吞吐事件流、日志、数据管道
RabbitMQ 业务消息、任务队列、复杂路由
RocketMQ 电商交易、顺序消息、延迟消息、事务消息
Pulsar 云原生、大规模、多租户、跨地域消息平台
ActiveMQ 传统 Java / JMS 企业系统

注意,这张表不是说某个 MQ 只能做某一种事情,而是它们各自最典型的设计方向不同。


三、Kafka

Kafka 与传统"消息队列"的思路有一点不同。

它更准确地说是一套分布式事件流平台

Kafka 中最重要的几个概念是:

  • Producer
  • Topic
  • Partition
  • Broker
  • Consumer
  • Consumer Group
  • Offset

消息发送到 Topic 后,会落到不同的 Partition 中。

例如:

text 复制代码
Topic: order-events

Partition 0: M1 M4 M7 ...
Partition 1: M2 M5 M8 ...
Partition 2: M3 M6 M9 ...

消费者通过 Consumer Group 并行消费不同 Partition。

Kafka 最大的特点:吞吐能力强

Kafka 的架构非常适合持续写入大量事件,因此经常被用于:

  • 日志采集
  • 用户行为埋点
  • CDC 数据同步
  • 数据管道
  • 实时流处理
  • 大数据平台
  • 事件驱动架构

例如:

text 复制代码
业务系统
   ↓
Kafka
   ↓
Flink / Spark / Elasticsearch / 数据仓库

Kafka 的顺序性

Kafka 并不是整个 Topic 全局有序。

Kafka 能够保证的是:

同一个 Partition 内的消息保持顺序。

因此,如果订单事件必须按照顺序处理,通常需要让同一个订单 ID 的消息进入同一个 Partition。

例如:

text 复制代码
orderId = 10001

创建订单
   ↓
支付成功
   ↓
订单发货
   ↓
订单完成

只要这些事件始终进入同一个 Partition,就可以利用 Partition 内的顺序性。

Kafka 的缺点

Kafka 虽然吞吐能力很强,但并不是所有业务都适合它。

例如业务只需要非常灵活的消息路由时,RabbitMQ 的 Exchange 模型通常更加直观。

Kafka 的 Partition、Consumer Group、Offset、Rebalance 等概念也会带来一定学习和运维成本。


四、RabbitMQ

RabbitMQ 是非常经典的消息代理(Message Broker)。

RabbitMQ 的核心模型通常是:

text 复制代码
Producer
   ↓
Exchange
   ↓
Queue
   ↓
Consumer

这里最重要的一个组件就是 Exchange

Producer 通常不是简单地把消息直接交给某个消费者,而是发送给 Exchange,再由 Exchange 根据路由规则把消息投递到一个或多个 Queue。

RabbitMQ 最大的特点:路由能力强

RabbitMQ 常见的 Exchange 类型包括:

  • Direct
  • Fanout
  • Topic
  • Headers

例如一个订单事件:

text 复制代码
order.created

可以通过不同的 routing key,把消息发送给不同的队列。

这种模型非常适合:

  • 订单通知
  • 邮件发送
  • 短信发送
  • 异步任务
  • 工作队列
  • 复杂业务路由

RabbitMQ 的确认机制

RabbitMQ 对业务消息的确认、重新投递、死信等机制支持非常成熟。

因此很多传统业务系统会选择 RabbitMQ 处理:

一条消息代表一个需要被可靠处理的业务任务。

例如:

text 复制代码
发送优惠券
发送短信
生成报表
执行异步任务

RabbitMQ 的缺点

如果业务目标是处理持续的大规模事件流、日志流或数据管道,Kafka 往往更符合这种架构思路。

RabbitMQ 更像一个"消息路由和任务分发中心",Kafka 更像一条可持续保存和回放的"事件日志"。


五、RocketMQ

RocketMQ 是 Apache 下的分布式消息和流平台,在 Java 后端、电商、交易系统中非常常见。

如果学习的是 Spring Boot、微服务、电商系统,RocketMQ 非常值得重点了解。

RocketMQ 的一个重要特点是:

它针对业务消息提供了很多直接可用的能力。

例如:

  • 普通消息
  • 顺序消息
  • 延迟消息
  • 事务消息

1. 顺序消息

例如一个订单必须按照下面的顺序处理:

text 复制代码
创建订单
   ↓
支付订单
   ↓
发货
   ↓
确认收货

RocketMQ 提供 FIFO / 顺序消息相关机制,可以让属于同一消息组的消息按照发送顺序进行存储和消费。

2. 延迟消息

电商中非常经典的场景就是:

用户下单后 30 分钟仍未支付,自动关闭订单。

可以把关闭订单的消息设置为延迟消息。

text 复制代码
创建订单
   ↓
发送延迟消息
   ↓
等待指定时间
   ↓
检查订单是否支付
   ↓
未支付 -> 关闭订单

3. 事务消息

例如:

text 复制代码
数据库订单状态更新成功
        +
订单支付成功消息发送成功

如果数据库更新成功,但是 MQ 消息没有发送出去,就可能产生数据不一致。

RocketMQ 的事务消息就是为这种场景设计的重要能力之一。

因此 RocketMQ 特别常见于:

  • 电商
  • 订单系统
  • 支付系统
  • 金融业务
  • 分布式业务事件

六、Pulsar

Pulsar 与 Kafka 有一些相似之处:

它不仅仅是传统队列,也定位于分布式消息和流处理场景。

Pulsar 比较有代表性的特点包括:

  • 多租户
  • 存储与服务层分离的架构思路
  • 跨地域复制
  • Topic 数量规模扩展
  • 消息队列与事件流统一
  • 分层存储

因此 Pulsar 经常更适合平台型系统。

例如公司内部有多个业务团队:

text 复制代码
租户 A
  ├─ 订单 Topic
  ├─ 支付 Topic
  └─ 库存 Topic

租户 B
  ├─ 日志 Topic
  ├─ 用户 Topic
  └─ 推荐 Topic

如果需要统一构建企业内部的消息平台,多租户和资源隔离能力就非常有价值。

Pulsar 的问题

Pulsar 的架构能力很强,但相应地系统组件、部署和运维理解成本也可能更高。

如果只是一个规模不大的普通业务系统,没有必要因为"功能多"就优先选择 Pulsar。


七、ActiveMQ

ActiveMQ 是一个历史比较悠久的 Java 消息中间件,在传统 Java 企业项目中非常常见。

它支持多种协议和 Java 消息生态,尤其经常与 JMS 联系在一起。

典型场景包括:

  • 传统 Java EE 系统
  • JMS 项目
  • 企业应用集成
  • 已经存在大量 ActiveMQ 基础设施的老项目

如果维护的是比较早的 Java 企业系统,很可能会看到 ActiveMQ。

对于新项目来说,则通常还会同时评估 RabbitMQ、RocketMQ、Kafka、Pulsar,以及 ActiveMQ 项目下更现代的 Artemis 等方案,再根据具体需求决定。


八、Kafka 和 RabbitMQ 最大的区别是什么?

这是面试和学习中最常见的问题之一。

可以先这样理解:

RabbitMQ 更强调"把一条业务消息正确地路由、投递给消费者"。
Kafka 更强调"持续记录一条事件流,并让消费者按照自己的进度读取"。

因此二者核心模型也不同。

RabbitMQ

text 复制代码
Producer
   ↓
Exchange
   ↓
Queue
   ↓
Consumer

重点在:

  • Exchange
  • Routing Key
  • Queue
  • ACK
  • Dead Letter

Kafka

text 复制代码
Producer
   ↓
Topic
   ↓
Partition
   ↓
Consumer Group
   ↓
Offset

重点在:

  • Topic
  • Partition
  • Consumer Group
  • Offset
  • Event Log

如果一定要用一句话记:

RabbitMQ 更像任务分发系统,Kafka 更像分布式事件日志。

这个理解虽然不是完整定义,但非常适合快速建立直觉。


九、Kafka 和 RocketMQ 怎么选?

这两个也是 Java 后端中非常容易被比较的 MQ。

如果业务主要是:

  • 日志
  • 埋点
  • 大数据
  • 实时计算
  • 流式数据处理
  • CDC

一般优先考虑 Kafka。

如果业务主要是:

  • 订单
  • 支付
  • 电商
  • 延迟消息
  • 顺序业务消息
  • 事务消息

RocketMQ 往往更贴近业务模型。

例如:

text 复制代码
日志采集 -> Kafka

订单支付事件 -> RocketMQ

当然,这并不意味着 Kafka 不能处理订单,也不意味着 RocketMQ 不能做高吞吐场景。

这里只是在讨论更典型的使用方向。


十、RabbitMQ 和 RocketMQ 怎么选?

如果系统更加看重:

  • 灵活路由
  • Exchange
  • 工作队列
  • 多种消息协议
  • 中小型业务异步任务

可以重点考虑 RabbitMQ。

如果更加看重:

  • 顺序消息
  • 延迟业务
  • 事务消息
  • 大型 Java / 电商业务

可以重点考虑 RocketMQ。


十一、五种 MQ 核心区别总结

对比项 Kafka RabbitMQ RocketMQ Pulsar ActiveMQ
核心定位 事件流平台 消息代理 分布式业务消息 / 流 云原生消息与流 传统企业消息中间件
典型模型 Topic + Partition Exchange + Queue Topic + MessageQueue Topic + Subscription Queue / Topic
吞吐倾向 很高 中高 很高 中等
路由灵活度 相对简单 很强 较强 较强 较强
顺序处理 Partition 内有序 Queue 场景下可维持顺序,但需考虑并发等因素 支持顺序消息 支持 Key_Shared 等模式处理有序需求 支持传统队列顺序语义
延迟消息 通常需要业务设计或相关机制实现 可通过 TTL / DLX 等方式实现常见延迟场景 原生支持延迟消息 支持延迟投递能力 可实现调度 / 延迟能力
事务相关能力 Kafka Transaction AMQP 事务 / Publisher Confirm 等 事务消息是重要特色 支持事务能力 JMS Transaction
典型场景 日志、数据流、实时计算 任务、通知、业务路由 电商、订单、交易 云原生消息平台 传统 Java 企业系统

这里的"吞吐倾向"只是架构层面的相对理解,并不是固定性能数据。

实际性能会受到:

  • 硬件
  • 消息大小
  • 副本数量
  • 持久化策略
  • ACK 策略
  • 网络
  • 消费方式
  • 集群规模

等大量因素影响。

因此不能简单理解成"Kafka 一定比 RabbitMQ 快多少倍"。


十二、实际项目到底怎么选?

可以参考下面这张图。

场景一:日志、埋点、大数据

优先考虑:

Kafka

例如:

text 复制代码
Spring Boot
   ↓
Kafka
   ↓
Flink
   ↓
Elasticsearch

场景二:普通业务异步任务

优先考虑:

RabbitMQ

例如:

text 复制代码
用户注册
   ↓
RabbitMQ
   ↓
邮件服务
短信服务

场景三:电商订单、支付

优先考虑:

RocketMQ

尤其业务需要:

  • 顺序消息
  • 延迟消息
  • 事务消息

时非常合适。


场景四:超大规模云原生消息平台

可以重点评估:

Pulsar

特别是存在:

  • 多租户
  • 跨地域
  • 大量 Topic
  • 平台化消息服务

等需求时。


场景五:老 Java / JMS 项目

可能继续使用:

ActiveMQ

如果是全新项目,则没有必要因为 ActiveMQ 历史悠久就直接选它,应该重新根据业务需求评估。


十三、不要只看"性能"选 MQ

很多人在选消息队列时喜欢问:

哪个 MQ 性能最高?

其实这不是最重要的问题。

真正需要考虑的是:

  1. 当前业务是什么类型?
  2. 是否要求消息严格可靠?
  3. 是否要求顺序?
  4. 是否需要延迟消息?
  5. 是否存在事务消息场景?
  6. 是否需要复杂路由?
  7. 消息量大概有多大?
  8. 是否需要保存并重复消费历史事件?
  9. 团队最熟悉哪一套技术?
  10. 运维是否能够支撑对应集群?

例如一个普通后台系统,每秒只有少量业务消息,却为了追求"高吞吐"搭建一套复杂的大规模消息平台,反而可能增加系统复杂度。

因此 MQ 选型永远应该是:

业务需求优先,而不是性能参数优先。


十四、最终怎么记?

如果只想快速记住五种 MQ,可以记下面这五句话。

Kafka

大数据、日志、事件流,优先想到 Kafka。

RabbitMQ

普通业务消息、异步任务、复杂路由,优先想到 RabbitMQ。

RocketMQ

Java 电商、订单、延迟、顺序、事务消息,优先想到 RocketMQ。

Pulsar

云原生、多租户、跨地域、大规模消息平台,重点考虑 Pulsar。

ActiveMQ

传统 Java / JMS 存量系统,经常能够看到 ActiveMQ。


十五、总结

Kafka、RabbitMQ、RocketMQ、Pulsar、ActiveMQ 都可以完成消息传递,但它们的设计重点并不相同。

MQ 一句话理解
Kafka 高吞吐分布式事件日志 / 事件流平台
RabbitMQ 灵活、成熟的业务消息路由代理
RocketMQ 面向交易和业务消息能力很完整的分布式 MQ
Pulsar 云原生、多租户的消息与流平台
ActiveMQ 传统 Java 企业消息中间件

对于大多数 Java 后端开发者来说,学习顺序可以是:

text 复制代码
RabbitMQ / RocketMQ
        ↓
理解业务消息队列
        ↓
Kafka
        ↓
理解事件流和大数据场景
        ↓
Pulsar
        ↓
理解云原生、大规模消息平台

真正掌握 MQ 的关键,并不是背诵谁的吞吐量最高,而是理解:

不同消息队列为什么会采用不同的架构,以及这种架构解决了什么业务问题。

当你能够根据业务场景判断应该使用 Kafka、RabbitMQ 还是 RocketMQ 时,才算真正理解了消息队列的选型。


参考资料

相关推荐
明月_清风1 小时前
开发者写PPT自救指南:4类对接场景,把技术讲清楚
前端·后端·面试
明月_清风1 小时前
从经典self-Attention 到 Flash Attention:为什么我们「不必算出每一个 âᵢ」
后端·ai编程
m0_640602441 小时前
2026 年餐饮收银系统前后端技术实现——核心架构与原理详解
后端·微服务·云原生·架构
Scene2161 小时前
Flux 与 Mono:Project Reactor 核心响应式类型深度解析
后端
lingran__1 小时前
C++ STL unordered系列(哈希) 底层剖析与模拟实现万字详解 | 基于哈希表,复刻 SGI-STL 泛型哈希容器架构
开发语言·c++·后端·哈希算法·哈希表·泛型编程·unordered系列
小林ixn1 小时前
NestJS 入门实战:从 0 到 1 撸一个 Todo CRUD,感受装饰器与模块化的优雅
后端·mvc·nestjs
阿弱1 小时前
graph-core 的边与命令模式设计
java·后端·agent
智驭未来掌门人1 小时前
利用Qt设计实现一款桌面程序
后端
长栎2 小时前
你以为抽象工厂是「创建一组对象」——其实它是「锁定产品族兼容性」
后端