目录
为什么需要消息队列
1. 异步处理
2. 系统解耦
3. 流量削峰
RabbitMQ vs Kafka vs RocketMQ 对比
基本信息
| 特性 | RabbitMQ | Kafka | RocketMQ |
|---|---|---|---|
| 开发语言 | Erlang | Scala/Java | Java |
| 开源协议 | MPL 2.0 | Apache 2.0 | Apache 2.0 |
| 维护方 | VMware | Apache/Confluent | Apache/阿里巴巴 |
| 协议支持 | AMQP、STOMP、MQTT | 自定义协议 | 自定义协议 |
架构设计
| 特性 | RabbitMQ | Kafka | RocketMQ |
|---|---|---|---|
| 架构模型 | Broker 中心化 | 分布式日志 | 分布式消息 |
| 元数据管理 | 内置/外部存储 | ZooKeeper/KRaft | NameServer |
| 消息存储 | 内存 + 磁盘 | 磁盘顺序写 | 磁盘顺序写 |
| 消息模型 | Exchange → Queue | Topic → Partition | Topic → Queue |
| 消费模式 | Push | Pull | Push/Pull |
性能对比
| 指标 | RabbitMQ | Kafka | RocketMQ |
|---|---|---|---|
| 单机吞吐量 | 万级 | 百万级 | 十万级 |
| 消息延迟 | 微秒级 | 毫秒级 | 毫秒级 |
| Topic 数量影响 | 小 | 大(慎用过多) | 小 |
| 消息堆积能力 | 一般 | 强 | 强 |
功能特性
| 功能 | RabbitMQ | Kafka | RocketMQ |
|---|---|---|---|
| 顺序消息 | ✅ 单队列 | ✅ 分区内有序 | ✅ 分区内有序 |
| 延迟消息 | ✅ 插件支持 | ❌ 不支持 | ✅ 原生支持 |
| 事务消息 | ✅ 支持 | ✅ 0.11+ 支持 | ✅ 原生支持 |
| 消息回溯 | ❌ 不支持 | ✅ 按 offset | ✅ 按时间/offset |
| 消息过滤 | ✅ 路由键 | ❌ 需客户端实现 | ✅ Tag/SQL92 |
| 死信队列 | ✅ 支持 | ❌ 需自行实现 | ✅ 支持 |
| 消息轨迹 | ✅ 插件支持 | ❌ 需自行实现 | ✅ 原生支持 |
| 消息优先级 | ✅ 支持 | ❌ 不支持 | ❌ 不支持 |
可靠性保障
| 特性 | RabbitMQ | Kafka | RocketMQ |
|---|---|---|---|
| 消息持久化 | ✅ | ✅ | ✅ |
| 消息确认 | ACK 机制 | Offset 提交 | ACK 机制 |
| 数据副本 | 镜像队列/Quorum | ISR 副本机制 | 主从复制/Dledger |
| 自动故障转移 | ✅ 需配置 | ✅ 自动 | ✅ Dledger 模式 |
适用场景
| MQ | 适用场景 | 不适用场景 |
|---|---|---|
| RabbitMQ | 低延迟、复杂路由、企业集成、中小规模 | 超大规模日志、超高吞吐 |
| Kafka | 日志收集、大数据处理、流计算、事件溯源 | 复杂消息特性、延迟消息 |
| RocketMQ | 电商/金融、分布式事务、订单系统、延迟消息 | 超低延迟(微秒级)、纯日志收集 |
选型建议
| 优先选择 | 场景描述 |
|---|---|
| RabbitMQ | 对延迟敏感、需要灵活路由、团队熟悉 AMQP |
| Kafka | 日志收集、实时数仓、流计算平台 |
| RocketMQ | 电商交易、金融业务、需要事务/延迟消息 |