Skip to content
清晨的一缕阳光
返回

消息队列选型指南:Kafka vs RocketMQ vs RabbitMQ

消息队列是分布式系统的核心组件。本文将深入对比 Kafka、RocketMQ、RabbitMQ 三大主流消息队列,帮助选择最适合的技术方案。

一、整体对比

1.1 核心特性对比

特性KafkaRocketMQRabbitMQ
开发语言Scala/JavaJavaErlang
开源组织ApacheApacheRabbit
协议自定义协议自定义协议AMQP
消息模型PullPull + PushPush
吞吐量100 万 TPS10 万 TPS1 万 TPS
延迟毫秒级毫秒级微秒级
可靠性非常高
可用性高(多副本)高(主从)高(集群)

1.2 架构对比

Kafka 架构

graph TB
    subgraph Kafka 集群
        B1[Broker 1]
        B2[Broker 2]
        B3[Broker 3]
    end
    
    P[Producer] --> B1
    C[Consumer] --> B2
    
    B1 -.->|副本 | B2
    B2 -.->|副本 | B3

RocketMQ 架构

graph TB
    NS[NameServer 集群]
    
    subgraph Broker 集群
        B1M[Broker 1 Master]
        B1S[Broker 1 Slave]
        B2M[Broker 2 Master]
        B2S[Broker 2 Slave]
    end
    
    P[Producer] --> NS
    C[Consumer] --> NS
    NS --> B1M
    NS --> B2M
    B1M -.-> B1S
    B2M -.-> B2S

RabbitMQ 架构

graph TB
    subgraph RabbitMQ 集群
        N1[Node 1]
        N2[Node 2]
        N3[Node 3]
    end
    
    P[Producer] --> N1
    C[Consumer] --> N2
    
    N1 -.->|镜像队列 | N2
    N2 -.->|镜像队列 | N3

二、详细对比

2.1 消息模型

Kafka

RocketMQ

RabbitMQ

2.2 可靠性

Kafka

可靠性配置:
- acks=all(所有副本确认)
- min.insync.replicas=2(最小 ISR)
- enable.idempotence=true(幂等性)
- 事务支持(Exactly-Once)

数据持久化:
- 顺序写盘
- 页缓存
- 副本复制

RocketMQ

可靠性配置:
- 同步刷盘(SYNC_FLUSH)
- 同步复制(SYNC_MASTER)
- 事务消息
- 消息回溯

数据持久化:
- CommitLog 顺序写
- ConsumeQueue 索引
- 主从复制

RabbitMQ

可靠性配置:
- 持久化队列
- 消息确认(Ack)
- 发布者确认(Confirm)
- 事务支持

数据持久化:
- 消息持久化到磁盘
- 镜像队列
- Quorum 队列

2.3 性能对比

吞吐量测试

测试条件:
- 消息大小:1KB
- 副本数:3
- 持久化:开启

结果:
| 消息队列 | TPS | 延迟 |
|----------|-----|------|
| Kafka | 100 万 | 10ms |
| RocketMQ | 10 万 | 5ms |
| RabbitMQ | 1 万 | 1ms |

延迟分布

Kafka:
- P50: 5ms
- P95: 15ms
- P99: 50ms

RocketMQ:
- P50: 3ms
- P95: 10ms
- P99: 30ms

RabbitMQ:
- P50: 0.5ms
- P95: 2ms
- P99: 5ms

2.4 功能特性

功能KafkaRocketMQRabbitMQ
顺序消息分区有序支持支持
定时/延迟消息不支持支持(18 级别)支持(TTL+DLX)
事务消息支持支持支持
消息回溯支持支持不支持
消息过滤不支持支持(Tag/SQL)支持(Header)
消息优先级不支持不支持支持
死信队列支持(Compaction)支持支持
消息追踪支持支持支持

三、适用场景

3.1 Kafka 适用场景

推荐场景

不推荐场景

典型案例

Netflix: 每日处理 5000 亿+ 消息
Uber: 实时位置数据处理
LinkedIn: 用户活动追踪

3.2 RocketMQ 适用场景

推荐场景

不推荐场景

典型案例

阿里巴巴:双 11 万亿级消息
蚂蚁金服:金融交易
小米:物联网消息

3.3 RabbitMQ 适用场景

推荐场景

不推荐场景

典型案例

GitHub: CI/CD 任务队列
Spotify: 消息推送
OpenStack: 内部通信

四、选型决策

4.1 决策矩阵

graph TD
    A[需求分析] --> B{吞吐量要求?}
    B -->|>10 万 TPS | C[Kafka]
    B -->|<10 万 TPS | D{延迟要求?}
    
    D -->|微秒级 | E[RabbitMQ]
    D -->|毫秒级 | F{功能需求?}
    
    F -->|定时/事务消息 | G[RocketMQ]
    F -->|复杂路由 | E
    F -->|流式处理 | C
    
    G --> H[金融/订单场景]
    C --> I[日志/流处理场景]
    E --> J[低延迟/路由场景]

4.2 评分表

维度KafkaRocketMQRabbitMQ
吞吐量⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐
延迟⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐
可靠性⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐
可用性⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐
功能丰富⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐
易用性⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐
社区活跃⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐
学习曲线⭐⭐⭐⭐⭐⭐⭐⭐⭐⭐

4.3 选型建议

选择 Kafka 如果

选择 RocketMQ 如果

选择 RabbitMQ 如果

五、迁移方案

5.1 Kafka → RocketMQ

// 1. 双写过渡期
public class DualWriteProducer {
    private KafkaProducer kafkaProducer;
    private RocketMQProducer rocketProducer;
    
    public void sendMessage(Message msg) {
        // 发送到 Kafka
        kafkaProducer.send(toKafkaRecord(msg));
        
        // 同时发送到 RocketMQ
        rocketProducer.send(toRocketMessage(msg));
    }
    
    public void switchToRocketMQ() {
        // 停止 Kafka 写入
        kafkaProducer.close();
        
        // 只使用 RocketMQ
    }
}

// 2. 消费者适配
public class CompatibleConsumer {
    public void consume() {
        // 同时消费 Kafka 和 RocketMQ
        // 去重处理
        // 逐步切换到 RocketMQ
    }
}

5.2 RabbitMQ → Kafka

// 1. 消息格式转换
public class MessageConverter {
    public ProducerRecord<String, String> convert(AMQP.BasicProperties props, byte[] body) {
        String key = extractKey(props);
        String value = new String(body);
        return new ProducerRecord<>("kafka-topic", key, value);
    }
}

// 2. 消费模式调整
// RabbitMQ: Push 模式
// Kafka: Pull 模式
public class KafkaConsumerAdapter {
    public void consume() {
        while (true) {
            ConsumerRecords records = consumer.poll(Duration.ofMillis(100));
            for (ConsumerRecord record : records) {
                process(record);
            }
            consumer.commitSync();
        }
    }
}

六、最佳实践

6.1 Kafka 最佳实践

1. 合理设置分区数
   - 分区数 = 最大消费者并发度
   
2. 配置副本因子
   - replication.factor=3
   - min.insync.replicas=2
   
3. 开启幂等性
   - enable.idempotence=true
   
4. 监控关键指标
   - Consumer Lag
   - UnderReplicatedPartitions
   - RequestLatency

6.2 RocketMQ 最佳实践

1. 合理设计 Topic
   - 按业务划分
   - 分区数适中
   
2. 配置主从复制
   - brokerRole=ASYNC_MASTER
   - flushDiskType=ASYNC_FLUSH
   
3. 实现幂等性
   - 消费者去重
   - 业务唯一键
   
4. 监控关键指标
   - 消费堆积
   - 主从同步延迟
   - TPS

6.3 RabbitMQ 最佳实践

1. 使用持久化
   - 队列持久化
   - 消息持久化
   
2. 配置确认机制
   - 发布者确认
   - 消费者确认
   
3. 合理设置 TTL
   - 消息过期时间
   - 队列最大长度
   
4. 监控关键指标
   - 队列长度
   - 消费者数量
   - 内存使用

总结

消息队列选型的核心要点:

  1. Kafka:超高吞吐、流处理、日志收集
  2. RocketMQ:金融级可靠、定时/事务消息、订单交易
  3. RabbitMQ:低延迟、复杂路由、快速开发

核心要点

参考资料


分享这篇文章到:

上一篇文章
以日为鉴:全民考公热的潮起与镜鉴
下一篇文章
GORM 实战指南 - Go 语言 ORM 最佳实践