Skip to content

消息队列对比:Kafka、RabbitMQ、RocketMQ

本文档对比三种主流消息队列系统的架构设计、实现原理和核心机制。


目录

  1. 概述
  2. 架构对比
  3. 核心机制详解
  4. 存储机制
  5. 可靠性保障
  6. 性能特性
  7. 适用场景
  8. 总结对比表

概述

特性KafkaRabbitMQRocketMQ
起源LinkedIn 开发,后捐献给 ApacheQPid 的替代者,由 SpringSource 开发阿里巴巴开源,后捐献给 Apache
协议自定义二进制协议AMQP、MQTT、STOMP自定义 TCP 协议
定位高吞吐分布式事件流平台功能丰富的企业级消息中间件金融级分布式消息中间件
语言Scala/JavaErlangJava

架构对比

Kafka 架构

┌─────────────┐     ┌─────────────┐     ┌─────────────┐
│   Producer  │────▶│    Broker   │     │   Consumer  │
│             │     │  (Leader)   │◀────│   Group     │
└─────────────┘     └──────┬──────┘     └─────────────┘

                    ┌──────▼──────┐
                    │  (Follower) │
                    │   Broker    │
                    └─────────────┘

                    ┌──────┴──────┐
                    │  Controller │ (KRaft/ZooKeeper)
                    └─────────────┘

核心组件:

  • Producer:消息生产者,将消息发送到指定 Topic 的 Partition
  • Broker:消息代理服务器,每个节点存储多个 Partition
  • Consumer:消息消费者,通过 Consumer Group 消费消息
  • Controller:集群控制器,负责 Leader 选举和元数据管理(Kafka 2.8+ 使用 KRaft 模式替代 ZooKeeper)

设计原则:

Kafka handles this differently. Our topic is divided into a set of totally ordered partitions, each of which is consumed by exactly one consumer within each subscribing consumer group at any given time.

来源:Apache Kafka Design Documentation

RabbitMQ 架构

┌─────────────┐     ┌─────────────┐     ┌─────────────┐
│   Producer  │────▶│   Exchange  │────▶│    Queue    │
│             │     │ (Routing)   │     │ (Storage)   │
└─────────────┘     └─────────────┘     └──────┬──────┘

                                         ┌─────▼─────┐
                                         │ Consumer  │
                                         └───────────┘

                                        ┌─────┴─────┐
                                        │  Cluster  │
                                        │ Federation│
                                        └───────────┘

核心组件:

  • Exchange:交换机,负责消息路由(Direct、Topic、Fanout、Headers 类型)
  • Queue:队列,存储消息直到被消费者处理
  • Binding:绑定关系,定义 Exchange 到 Queue 的路由规则
  • Virtual Host:虚拟主机,提供多租户隔离

路由机制:

RabbitMQ 支持多种 Exchange 类型进行灵活的消息路由:

  • Direct Exchange:精确匹配 routing key
  • Topic Exchange:通配符模式匹配(* 单词,# 多词)
  • Fanout Exchange:广播到所有绑定的队列

来源:RabbitMQ Server Documentation

RocketMQ 架构

┌─────────────┐     ┌─────────────┐     ┌─────────────┐
│   Producer  │────▶│    Broker   │     │   Consumer  │
│             │     │ Master/Slave│     │ Push/Pull   │
└─────────────┘     └──────┬──────┘     └─────────────┘

                    ┌──────┴──────┐
                    │  NameServer │ (路由注册中心)
                    └─────────────┘

核心组件:

The system architecture relies on four core components: NameServer, which acts as the routing registry; Broker, which serves as the message storage service; Producer, which handles message generation; and Consumer, which manages message consumption.

来源:Apache RocketMQ Site

  • NameServer:路由注册中心,维护 Broker 元数据和 Topic 路由信息
  • Broker:消息代理服务,负责消息存储和转发(Master-Slave 架构)
  • Producer:消息生产者
  • Consumer:消息消费者(Push 或 Pull 模式)

核心机制详解

消息模型对比

概念KafkaRabbitMQRocketMQ
主题TopicExchange + QueueTopic
分区Partition-Queue
消费者组Consumer GroupQueueConsumer Group
偏移量Offset-Queue Offset

Kafka Consumer Group 机制

Each partition is 'consumed by exactly one consumer within each subscribing consumer group' — meaning if two consumer groups subscribe to the same topic, both groups independently receive all messages.

Kafka will deliver each message in the subscribed topics to one process in each consumer group. This is achieved by balancing the partitions between all members in the consumer group so that each partition is assigned to exactly one consumer in the group.

来源:KafkaConsumer Javadoc

Rebalancing 机制:

  • 当消费者加入/离开群组时触发
  • 重新分配 Partition 给存活消费者
  • 支持 cooperative-sticky 策略减少重平衡开销

RabbitMQ 消息确认机制

erlang
%% Set QoS prefetch count
#'basic.qos_ok'{} = amqp_channel:call(Channel, #'basic.qos'{prefetch_count = 10}).

%% Manual acknowledgement
#'basic.consume'{no_ack = false}

%% Acknowledge message
amqp_channel:cast(Channel, #'basic.ack'{delivery_tag = DeliveryTag})

%% Negative acknowledge with requeue
amqp_channel:cast(Channel, #'basic.nack'{
    delivery_tag = DeliveryTag,
    multiple = true,
    requeue = false
})

来源:RabbitMQ Server - Consume Messages

确认模式:

  • auto_ack:自动确认,消息推送即确认
  • manual_ack:手动确认,处理完成后确认
  • publisher_confirms:发布者确认机制

RocketMQ 事务消息机制

RocketMQ implements transactional messaging by configuring a transaction checker and managing local transaction state. It ensures eventual consistency by committing or rolling back messages based on local business logic execution.

来源:Apache RocketMQ - Transaction Messaging

事务消息流程:

  1. 发送 Half 消息到 Broker
  2. 执行本地事务
  3. 根据事务结果 Commit 或 Rollback
  4. Broker 定期检查未决事务
java
Transaction transaction = producer.beginTransaction();
Message message = provider.newMessageBuilder()...build();

try {
    SendReceipt sendReceipt = producer.send(message, transaction);
    boolean localTransactionSuccess = executeLocalTransaction(orderId);
    if (localTransactionSuccess) {
        transaction.commit();
    } else {
        transaction.rollback();
    }
} catch (ClientException e) {
    transaction.rollback();
}

存储机制

Kafka 存储架构

Log Segment 结构:

topic-partition-0/
├── 00000000000000000000.log
├── 00000000000000000000.index
├── 00000000000000000000.timeindex
├── 00000000000000000000.snappy
└── ...

Record Batch Format:

text
baseOffset: int64
batchLength: int32
partitionLeaderEpoch: int32
magic: int8
crc: uint32
attributes: int16          // 压缩算法标识 (0:none, 1:gzip, 2:snappy, 3:lz4, 4:zstd)
lastOffsetDelta: int32
baseTimestamp: int64
maxTimestamp: int64
producerId: int64
producerEpoch: int16
baseSequence: int32
recordsCount: int32
records: [Record]

来源:Kafka Message Format Implementation

核心技术:

  1. 零拷贝(Zero-Copy):使用 sendfile 系统调用,避免用户态和内核态的数据复制
  2. Page Cache:利用操作系统页缓存,无需自己实现缓存管理
  3. 顺序写:将随机 IO 转为顺序 IO,大幅提升写入性能
  4. 批量发送:Producer 端批量消息,减少网络交互

ISR(In-Sync Replicas)机制:

A message in Kafka is considered committed to the log only when all replicas in the in-sync replicas (ISR) for that partition have applied it.

Kafka uses a dynamic set of in-sync replicas (ISR) that are caught up to the leader. Only members of this set are eligible for leader election.

来源:Kafka Design Documentation

RocketMQ 存储架构

存储文件结构:

Apache RocketMQ stores messages by default in local disk files. The storage structure includes a commitlog folder for physical message files and a consumeCQueue folder for logical queue indexes.

来源:RocketMQ Message Storage Policy

storePathRootDir/
├── commitlog/           # 物理存储文件,按时间顺序追加写入
│   ├── 00000000000000000000
│   └── ...
├── consumequeue/        # 逻辑队列索引,按 Topic+Queue 组织
│   ├── TopicA/
│   │   └── 000000.queue
│   └── ...
├── index/               # 索引文件,支持关键词查询
└── filter/              # 过滤文件

CommitLog 机制:

  • 所有 Topic 消息共享同一个 CommitLog 文件
  • 顺序追加写入,最大化磁盘 IO 效率
  • 单个文件大小默认 1GB

ConsumeQueue 机制:

  • 存储消息在 CommitLog 中的偏移量指针
  • 格式:offset(8bytes) + size(4bytes) + tagHash(8bytes)
  • 按 Topic+Queue 独立组织

RabbitMQ 存储机制

内存 vs 持久化:

  • Transient 消息:仅存储在内存,速度快但重启丢失
  • Persistent 消息:持久化到磁盘,保证可靠性

队列类型:

  • Classic Queue:传统队列,主从复制
  • Quorum Queue:基于 Raft 协议的强一致性队列
  • Stream Queue:高吞吐流式队列

Policy 配置示例:

bash
# TTL and max-length policy
rabbitmqctl set_policy -p my-vhost limits "^limited\." \
  '{"message-ttl":86400000,"max-length":10000}' \
  --apply-to queues

# Dead-letter policy
rabbitmqctl set_policy -p my-vhost dlx ".*" \
  '{"dead-letter-exchange":"dlx","dead-letter-routing-key":"failed"}' \
  --apply-to queues

来源:RabbitMQ Policies


可靠性保障

消息投递语义

语义KafkaRabbitMQRocketMQ
At Most Once✓ (disable retries)✓ (no ack)
At Least Once✓ (default)✓ (default)✓ (default)
Exactly Once✓ (事务+幂等)✓ (事务消息)

Kafka Exactly-Once:

By default, Kafka guarantees at-least-once delivery. At-most-once delivery can be implemented by disabling producer retries and committing consumer offsets before processing messages.

来源:Kafka Design - Exactly-Once Semantics

副本机制

项目KafkaRabbitMQRocketMQ
副本类型Leader-FollowerMirror/QuorumMaster-Slave
同步方式同步/异步 ISR同步复制同步/异步
选举机制自动 Leader 选举自动故障转移自动切换

Kafka ISR 指标监控:

kafka.server:type=ReplicaManager,name=IsrShrinksPerSec
kafka.server:type=ReplicaManager,name=IsrExpandsPerSec
kafka.server:type=ReplicaManager,name=FailedIsrUpdatesPerSec

来源:Kafka Operations - Monitoring

RocketMQ HA 机制

同步复制(Sync):

  • Master 写入成功后等待 Slave 确认
  • 保证数据不丢失,但影响性能

异步复制(Async):

  • Master 写入成功立即返回
  • 高性能,但有少量数据丢失风险

性能特性

吞吐量对比

指标KafkaRabbitMQRocketMQ
峰值吞吐百万级/秒十万级/秒十万级/秒
延迟毫秒级微秒级毫秒级
并发连接极高

RabbitMQ 全局计数器

Global counters in RabbitMQ are designed to address issues with traditional counters when metrics are aggregated. They ensure that metrics do not decrease due to the garbage collection of terminated connections or channels.

来源:RabbitMQ Prometheus Metrics

关键指标:

  • rabbitmq_global_messages_received_total:接收消息总数
  • rabbitmq_global_messages_delivered_total:投递消息总数
  • rabbitmq_global_messages_acknowledged_total:确认消息总数
  • rabbitmq_global_messages_redelivered_total:重投消息总数

RocketMQ 高级特性

延迟消息:

java
// 设置定时投递时间:当前时间 + 10 分钟
long deliverTimestamp = System.currentTimeMillis() + 10L * 60 * 1000;

Message message = provider.newMessageBuilder()
    .setDeliveryTimestamp(deliverTimestamp)
    ...build();

来源:RocketMQ Delay Message

顺序消息(FIFO):

java
// 同一订单的消息使用相同的消息组,保证顺序
String orderId = "ORDER_12345";

Message message = provider.newMessageBuilder()
    .setMessageGroup(orderId)  // 设置消息组,相同组的消息顺序投递
    ...build();

来源:RocketMQ FIFO Messages

SQL92 过滤:

java
String sqlExpression = "Region IS NOT NULL AND Region = 'Hangzhou' AND Price > 30";
FilterExpression sqlFilter = new FilterExpression(sqlExpression, FilterExpressionType.SQL92);
pushConsumer.subscribe(topic, sqlFilter);

来源:RocketMQ SQL Filtering


适用场景

Kafka

适合场景:

  • ✅ 大数据日志收集
  • ✅ 实时数据流处理
  • ✅ 事件溯源(Event Sourcing)
  • ✅ 高吞吐消息管道

不适合场景:

  • ❌ 低延迟要求(微秒级)
  • ❌ 复杂路由需求
  • ❌ 小消息频繁发送

RabbitMQ

适合场景:

  • ✅ 企业应用消息通信
  • ✅ 复杂路由需求
  • ✅ 多协议支持(AMQP/MQTT/STOMP)
  • ✅ 低延迟要求

不适合场景:

  • ❌ 海量消息堆积
  • ❌ 超高吞吐场景

RocketMQ

适合场景:

  • ✅ 金融级交易消息
  • ✅ 事务消息需求
  • ✅ 延迟/定时消息
  • ✅ 顺序消息保证
  • ✅ 消息回溯查询

不适合场景:

  • ❌ 简单消息传递(过于重量级)

总结对比表

维度KafkaRabbitMQRocketMQ
吞吐量⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐
延迟⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐
可靠性⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐
功能丰富度⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐
运维复杂度⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐
社区活跃度⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐
学习曲线中等简单较难

选型建议

  1. 选择 Kafka:需要高吞吐、大数据量、日志收集、流式计算
  2. 选择 RabbitMQ:需要复杂路由、低延迟、多协议、企业应用集成
  3. 选择 RocketMQ:需要金融级可靠性、事务消息、定时消息、消息追踪

参考资料

  1. Apache Kafka Design Documentation
  2. Kafka Message Format Implementation
  3. KafkaConsumer Javadoc
  4. RabbitMQ Server Documentation
  5. RabbitMQ Prometheus Metrics
  6. Apache RocketMQ Site
  7. RocketMQ Message Storage Policy

文档生成时间:2026-05-07数据来源:Context7 MCP Server

更新于:

note