Sunday面试指南

Kafka、RabbitMQ、RocketMQ 有什么区别?消息队列怎么选?

🧑‍💻 面试官:Kafka、RabbitMQ、RocketMQ 怎么选?

🙋‍♂️ 我:Kafka 吞吐高,RabbitMQ 延迟低,RocketMQ 适合业务消息。

🧑‍💻 面试官:同一条事件要被三套系统独立读取,还要过几天重放,哪个条件最重要?

🙋‍♂️ 我:需要保留消息,支持独立消费进度。

🧑‍💻 面试官:那另一个场景是按复杂路由分发任务、失败后重新交给工作者,你还会只比较吞吐吗?

选消息队列先看「消息怎样保存、怎样分发、怎样重新处理」,性能是这些约束满足之后的比较。

面试速答(60 秒版)

不能只给三种队列排一个固定性能名次。Kafka 的核心是分区日志,适合多组消费者独立读取与重放事件流;RabbitMQ 的传统队列模型通过交换机和绑定路由消息,常用于任务分发与灵活路由;RocketMQ 提供主题与消费组,并有顺序、延迟、事务消息等能力。

这些是比较入口,不是互斥标签。RabbitMQ 还有 Streams 等不同模型,各产品能力也受版本、队列类型和配置影响。

实际选型会先明确:要不要重放、顺序保证在哪个范围、任务如何确认、延迟与失败如何处理,再比较同等可靠性配置下的吞吐、尾部延迟、存储和运维成本。消息队列也不会自动保证业务副作用只执行一次。

按日志重放、队列路由和顺序延迟能力比较消息队列

知识点详解:把产品名字换成消息的生命周期来看

先问消息消费后还要不要留着

假设一条用户行为事件要被统计、风控和推荐独立处理,明天还可能修复逻辑后重新读取。保留日志与独立消费位置,就比「抢到一个任务赶紧执行」更重要。

Kafka 的分区日志模型适合从这个角度评估。不同消费组可以独立推进,消息保留由策略管理,不因为某一个组读过就马上删除。

如果需求是给工作者分配任务、按条件路由、确认完成后从队列移除,则应优先比较对应队列模型。RabbitMQ 的交换机、绑定和传统队列常用于这类组织方式,但不能把 Streams 等能力也说成同一种删除语义。

顺序和可靠性不能只看功能名

Kafka 的顺序通常以分区为单位;RocketMQ 顺序消息需要按消息组等条件组织;RabbitMQ 队列的实际处理次序还会受消费者并发、优先级和重投影响。

「支持顺序」不意味着跨所有生产者、所有分区全局有序。「支持事务消息」也不意味着任意数据库修改和外部副作用被统一纳入分布式事务。

要顺着完整链路看:生产端是否确认写入,Broker 如何保存和复制,消费者何时确认,业务重试是否去重。某一段可靠,不能替其他段作保证。

把需求写成可测试的条件

假设队列要支撑报表任务。先约定消息体大小、任务时长、峰值、允许等待多久、是否需要取消,以及失败后保留多久。再检查路由、重试和延迟能力是否满足。

压测时使用相近的复制、持久化和确认条件,包含下游变慢、消费者重启与节点故障。否则拿一个异步不等待确认的结果,去比较另一个严格确认的结果,结论并不公平。

还要算团队成本:监控、容量规划、升级经验、故障恢复与客户端支持。产品性能上限很高,并不等于团队已经具备相应运维能力。

先满足模型,再决定要不要增加组件

一种系统可以有多种消息需求,但不必立刻引入三种中间件。现有组件满足主要约束,且成本可接受时,复用通常比追逐功能名更实际。

如果模型确实不同,例如可重放事件流与独立任务调度有明显差别,再考虑边界清晰地分工。不要让同一任务在多种队列间来回搬运,却说不清谁负责最终完成与故障恢复。

上线验收除了看发送成功,还要证明重启后的消费进度、失败重试和业务结果正确。

本题机制参考:Kafka 4.3 Design、RabbitMQ Queues、RabbitMQ Confirms、RocketMQ Ordered Message、RocketMQ Delay Message。

面试官继续追问

Kafka 只能做日志采集吗?

不是。它可承载很多事件与消息场景。分区日志是选型依据,不是限制用途的行业标签。

RabbitMQ 消息消费后一定删除吗?

要看使用的模型与确认行为。传统队列和 Streams 不能混为一个语义。

选择支持 exactly-once 的产品就不用幂等了吗?

不能这样推断。保证范围要看协议、事务和参与资源,外部数据库或接口副作用通常仍需单独设计。

面试速记卡

  • 先比保存、路由、重放与失败语义。
  • Kafka:分区日志与独立消费进度。
  • RabbitMQ:传统队列路由,也有其他模型。
  • RocketMQ:主题消费组及顺序、延迟等能力。
  • 版本与配置限定能力;同等可靠性下再比性能。

公司面试真题

真题根据求职者公开面经整理,题意经过概括,非逐字原话或公司官方题库;本文为 Sunday 的独立解析。

  • 美团 · Java后端 · 实习

    Kafka 和 RabbitMQ 有什么区别,项目为什么选 Kafka?(题意整理)

    4.21美团Java实习一二面面经 ↗
    面试记录为 2020-04-21、2020-04-24;原帖编辑于 2020-11-14

浏览公司面试真题 →
简历汪永久免费在线制作简历,模板直接套用、导出无水印,永久免费、下载免费,不需要付费解锁任何功能。去写简历