5月27日 22:23
Kafka 和 RabbitMQ、RocketMQ 怎么选?
核心区别一图看懂
| 维度 | Kafka | RabbitMQ | RocketMQ |
|---|---|---|---|
| 定位 | 分布式流处理平台 | 传统消息代理 | 分布式消息中间件 |
| 吞吐量 | 百万级 TPS | 万级 TPS | 十万级 TPS |
| 延迟 | 毫秒级 | 微秒级 | 毫秒级 |
| 消息留存 | 按时间/容量保留,消费后不删 | 消费确认后删除 | 可配置保留策略 |
| 消费模型 | Pull 拉取 | Push 推送为主 | Push + Pull 均支持 |
| 路由能力 | 基于 Topic 和分区 | Exchange 多种路由模式 | Topic + Tag 两级过滤 |
| 顺序保证 | 分区内有序 | 队列内有序 | 全局顺序消息 |
| 事务消息 | 支持(0.11+) | 不支持 | 原生支持,最完善 |
| 适用场景 | 日志流、事件流、大数据管道 | 任务队列、微服务通信、复杂路由 | 电商订单、金融交易、事务消息 |
为什么 Kafka 吞吐量远超另外两个?
Kafka 的核心设计围绕"顺序写磁盘 + 零拷贝 + 分区并行"三个点。磁盘顺序写速度可达 600MB/s,远超随机写的 100KB/s。零拷贝(sendfile 系统调用)让数据直接从页缓存到网卡,跳过用户态拷贝。分区机制则将负载分散到多个 Broker 并行处理。
RabbitMQ 的优势不在于吞吐,而在于路由灵活性——四种 Exchange 类型(direct、topic、fanout、headers)能实现复杂的消息分发逻辑,延迟也在微秒级别,适合对实时性要求高但吞吐不大的场景。
RocketMQ 在事务消息上做得最完善:半消息 + 本地事务 + 回查机制,保证分布式事务的最终一致性,这是 Kafka 和 RabbitMQ都不具备的。
选型怎么决策?
三个问题就能定:
- 消息量大吗? 日均亿级以上选 Kafka,百万级以下 RabbitMQ 够用
- 需要消息回溯吗? Kafka 天然支持,RabbitMQ 消费完就删
- 涉及钱吗? 金融、订单场景选 RocketMQ,事务消息是刚需
很多团队的做法是 Kafka 做事件流 + RabbitMQ 做任务队列,各取所长。
面试追问方向
- Kafka 为什么用 Pull 不用 Push? Push 模式下消费者处理能力不一,慢消费者会拖垮 Broker;Pull 让消费者按自己节奏消费,还方便回溯和批量拉取
- RocketMQ 的 NameServer 和 Kafka 的 ZooKeeper 有什么区别? NameServer 无状态、无主从,部署简单但功能弱于 ZK;Kafka 新版 KRaft 模式已去 ZK 依赖
- 消息积压怎么处理? Kafka 扩分区 + 增 Consumer;RabbitMQ 临时加消费者队列;RocketMQ 调大消费线程池