Kafka vs RocketMQ vs RabbitMQ
面试官问候选人小李:"你们公司用的什么MQ?"
小李说:"Kafka。"
面试官追问:"为什么选Kafka而不是RocketMQ或RabbitMQ?"
小李愣了一下:"呃...Kafka吞吐量高?"
面试官继续问:"那什么时候用RocketMQ?什么时候用RabbitMQ?"
小李答不上来了。
【面试官心理】
这道题我考察的是候选人对MQ生态的全局认知。90%的候选人只会用一种MQ,说不出其他两种的优劣。能说出三者的核心差异、适用场景和选型依据的,是有技术视野的P6+。能说出"根据业务场景做技术选型"而不是"因为团队熟悉所以用"的,才是真正有架构思维的候选人。
一、核心问题:三大 MQ 的本质差异 🔴
1.1 问题拆解
第一层:基本认知 面试官问:"Kafka、RocketMQ、RabbitMQ有什么区别?" 候选人答:"Kafka吞吐高,RocketMQ功能全,RabbitMQ功能多..." 考察点:表面认知
第二层:架构差异 面试官追问:"它们的消息模型一样吗?存储机制有什么不同?" 候选人答:...(拉开点1) 考察点:底层原理
第三层:场景适用 面试官追问:"什么场景用Kafka?什么场景用RocketMQ?什么场景用RabbitMQ?" 候选人答:...(核心拉开点) 考察点:场景化选型能力
第四层:决策依据 面试官追问:"如果让你从头设计一个新系统,你怎么选MQ?" 候选人答:...(P7区分点) 考察点:架构决策能力
1.2 错误示范
候选人原话 A:"RabbitMQ是 Erlang 写的,性能不如Java的Kafka。"
问题诊断:
- 用语言判断性能是错误的
- RabbitMQ的瓶颈从来不是语言,而是架构设计
- Erlang的并发模型反而更适合AMQP协议
- 暴露了对MQ架构的浅层理解
候选人原话 B:"Kafka能做的RocketMQ都能做,选RocketMQ就行了。"
问题诊断:
- RocketMQ无法替代Kafka在大数据场景的地位
- 生态差距巨大(Kafka Connect、Streams、Flink等深度集成)
- 两者是互补关系,不是替代关系
候选人原话 C:"RabbitMQ功能最全,所以是最好的MQ。"
问题诊断:
- 功能全不代表适合所有场景
- RabbitMQ的万级吞吐在百万级场景下根本不够用
- 没有"最好",只有"最适合"
1.3 标准回答
三大 MQ 的核心定位
【面试官心理】
这道题我想听到的是"场景驱动选型"而非"哪个MQ更好"。能说出"大数据用Kafka、交易用RocketMQ、小系统用RabbitMQ"并能解释每个结论背后的原因的,说明真正理解了三者的设计哲学。
二、延伸问题:六维度全面对比 🟡
2.1 核心维度对比表
2.2 顺序消息对比
2.3 事务消息对比
2.4 延迟消息对比
三、生产避坑:选错 MQ 的代价
3.1 坑一:用 RabbitMQ 做高吞吐场景
场景:团队用RabbitMQ处理日志,日均消息量10亿条。
问题:
- RabbitMQ的吞吐只有万级,根本扛不住
- 消息堆积严重,内存持续增长
- 最后RabbitMQ直接OOM崩溃
正确做法:
- 日志采集、大数据场景用Kafka
- RabbitMQ的定位不是高吞吐,是灵活路由
3.2 坑二:用 Kafka 做事务消息
场景:团队用Kafka实现分布式事务。
问题:
- Kafka的"事务"只是幂等语义
- 本地事务和消息发送的一致性无法保证
- 需要自己实现消息表模式,复杂度极高
正确做法:
- 需要事务消息的场景用RocketMQ
- RocketMQ的事务消息是原生支持,生产可用
3.3 坑三:用 Kafka 做小消息低延迟场景
场景:团队用Kafka处理聊天消息(单条消息<1KB,对延迟敏感)。
问题:
- Kafka的批量处理模型导致单条消息延迟高(linger.ms=10ms)
- 消息从发送到消费可能需要几十毫秒
- RabbitMQ的延迟只有微秒级
正确做法:
- 低延迟场景用RabbitMQ
- 或者把linger.ms设低(但会牺牲吞吐)
四、工程选型:场景驱动的选型矩阵
4.1 选型决策树
4.2 场景化选型
4.3 混用策略
大型系统通常不会只用一种MQ:
【面试官心理】
面试这道题,我会问一个开放问题:"你们公司现在的MQ选型合理吗?如果让你重新选型,你会换吗?"能说出当前选型的优劣和潜在风险的,说明真正做过技术选型。只知道"现在用的挺好的为什么要换"的是缺乏技术判断力的P5。能说出"混用策略"和"如何渐进式迁移"的,是有架构视野的P7。