《Java 100 天进阶之路》第96篇:消息队列面试高频题(2026版)
第96篇:消息队列面试高频题(2026版)
📌系列导航:《Java 100 天进阶之路》完整目录 |
⬅️ 上一篇:第95篇:消息队列基础(RocketMQ/Kafka) |
➡️ 下一篇:第97篇:微服务架构演进(待发布)
一、核心考点全景图
本文精选20+ 道RocketMQ / Kafka “大厂”高频面试题,覆盖以下 6 大模块,其中事务消息、顺序消息、积压治理是拉开分差的关键。
| 考点模块 | 核心关键词 | 面试考察目标 |
|---|---|---|
| 基础概念 | 点对点、发布订阅、Topic、Partition、Offset | 考察对消息模型的理解 |
| 可靠性保障 | 消息丢失、重复消费、幂等、事务消息 | 考察数据一致性设计能力 |
| 顺序消息 | 全局有序、分区有序、哈希路由 | 考察业务场景与架构匹配能力 |
| 积压与限流 | 积压排查、动态扩容、死信队列 | 考察生产环境故障处理经验 |
| 高可用与性能 | 集群、ISR、Leader 选举、零拷贝 | 考察分布式系统设计深度 |
| 选型与演进 | RocketMQ vs Kafka、KRaft、Serverless | 考察技术前瞻性与权衡能力 |
二、消息队列基础概念篇
Q1:消息队列的点对点模型和发布/订阅模型有什么区别?
- 点对点:一个消息只能被一个消费者消费,消费后消息从队列移除(如 RabbitMQ、RocketMQ 普通模式)。
- 发布/订阅:一个消息可被多个消费者订阅(Topic),每个消费者都能收到完整副本(如 Kafka、RocketMQ 广播模式)。
💡加分:Kafka 通过 Consumer Group 实现两种模型的统一:同组内竞争消费(点对点),不同组各自消费(发布/订阅)。
Q2:Kafka 的 Topic、Partition、Offset 分别是什么?
- Topic:逻辑消息主题。
- Partition:Topic 物理分片,提供顺序保证和水平扩展能力。
- Offset:分区内消息的唯一序号,消费者通过提交 Offset 记录消费进度。
💡加分:Offset 存储在内部 Topic__consumer_offsets(Kafka)或 Broker(RocketMQ)。
Q3:RocketMQ 的 NameServer 和 Broker 分别负责什么?
- NameServer:轻量级路由中心,无状态,集群间不通信,提供 Topic 路由信息。
- Broker:消息存储节点,主从架构,处理读写请求。
💡加分:NameServer 简单可靠,但故障时 Producer 可缓存路由,不影响发送。
Q4:Consumer Group 在 Kafka 和 RocketMQ 中的作用?
- Kafka:组内消费者共同消费 Topic 的不同分区,一个分区只能被组内一个消费者消费。
- RocketMQ:组内消费者共同消费 Topic 的 MessageQueue,支持集群模式(默认)和广播模式。
💡加分:消费者数不能超过分区数,否则多余消费者空闲。
三、消息可靠性篇
Q5:如何保证消息不丢失?(三阶段全链路分析)
| 阶段 | 风险点 | 解决方案 |
|---|---|---|
| 生产端 | 发送失败、网络抖动 | 同步发送 + ACK,失败落库重试,或事务消息 |
| Broker端 | 主节点宕机、刷盘超时 | 多副本(ISRmin.insync.replicas >= 2),同步刷盘(flushDiskType = SYNC_FLUSH) |
| 消费端 | 自动提交 Offset 后业务失败 | 手动提交 Offset,业务成功后再确认 |
💡加分:生产端可开启
retries(Kafka)或异步发送 + 回调;RocketMQ 建议使用SYNC_MASTER同步双写。
Q6:如何避免消息重复消费?(幂等设计)
- 唯一ID + Redis SETNX:消费前
SETNX,成功则处理,失败则跳过。- 数据库唯一键:利用 DB 唯一索引防止重复插入。
- 状态机:业务状态流转(如订单从“待支付”到“已支付”),重复消息无效。
💡加分:Kafka 从 0.11 版本开始支持幂等生产者(enable.idempotence=true),但仅保证单分区内不重复,跨分区仍需业务幂等。
Q7:RocketMQ 事务消息的原理?
二阶段提交 + 回查机制:
- 发送半消息(HB)到 Broker,对消费者不可见。
- 执行本地事务(如更新数据库)。
- 根据本地事务结果发送 Commit/Rollback。
- 若 Broker 长时间未收到二次确认,主动回查生产者,询问事务状态。
💡加分:默认回查 15 次,间隔 1 分钟,需实现LocalTransactionChecker接口。
Q8:Kafka 的幂等生产者与事务生产者有什么区别?
- 幂等生产者(
enable.idempotence=true):保证单分区内消息不重复,适合单分区顺序场景。- 事务生产者(
initTransaction()):支持跨分区原子写入,用于“消费-处理-生产”的 Exactly-Once 场景(如 Kafka Streams)。
💡加分:事务生产者性能较低,非必要不用。
Q9:RocketMQ 普通消息默认重试多少次?达到上限后怎么办?
默认重试 16 次,但每日凌晨会清零(阿里云规则)。生产环境建议业务侧记录重试次数,超过阈值(如 10 次)投递到死信队列(DLQ),人工介入。
💡加分:死信队列仍可重新消费,可用于异常补偿。
Q10:Kafka 的 ISR 机制如何保证数据不丢失?
- ISR(In-Sync Replicas):与 Leader 保持同步的副本集合。
- 生产者可配置
acks=all,要求所有 ISR 副本确认才认为写入成功。- Leader 宕机时,新 Leader 从 ISR 中选举,确保已确认消息不丢失。
💡加分:min.insync.replicas配合acks=all可控制至少几个副本同步,例如min.insync.replicas=2且副本数=3,允许挂一个副本。
四、顺序消息篇
Q11:如何保证消息的顺序消费?
- RocketMQ:发送时使用
MessageQueueSelector将同一业务键(如订单 ID)发往同一 MessageQueue;消费端单线程消费该队列。- Kafka:生产者指定
key,同一 key 进入同一 Partition;每个 Partition 由消费者单线程处理。
💡加分:严格全局有序需使用单 Partition/Queue,会严重制约水平扩展,一般用分区内有序即可。
Q12:顺序消息和普通消息在性能上有什么区别?
顺序消息需保证同一队列串行处理,无法并行消费,吞吐量低于普通消息。建议将非严格顺序的业务拆分成多个分区/队列,利用并行提升性能。
五、积压与限流篇
Q13:线上消息积压如何快速处理?
紧急方案:
- 临时扩容消费者实例(Kafka 不超过分区数,RocketMQ 不超过 Queue 数)。
- 若消费逻辑耗时长,改为异步处理,先 ACK 再异步执行。
- 写一个临时消费者,将消息批量转发到新的 Topic(增加分区),再启动更多消费者。
长期方案:优化消费逻辑(批量操作、增加缓存)、提高分区数、合理配置线程池。
💡加分:RocketMQ 可启用pull模式手动控制拉取速率。
Q14:RocketMQ 的死信队列如何处理?
- 消息重试超过
maxReconsumeTimes(默认16次)后进入死信队列(DLQ)。- 死信队列以
%DLQ%为前缀,可人工订阅,排查原因后重新发送或补偿。
💡加分:每日凌晨重试计数器清零是阿里云特殊规则,自建 RocketMQ 不重置,需注意区别。
Q15:Kafka 的消费者 Rebalance 机制会导致什么问题?
- 当消费者加入/退出或分区变化时,触发 Rebalance,期间所有消费者暂停消费。
- 如果消费逻辑耗时过长(超过
max.poll.interval.ms),会被踢出 Group,引发反复 Rebalance,导致消息积压。
💡加分:优化消费速度,或将max.poll.records调小,同时设置合理的session.timeout.ms。
六、高可用与性能篇
Q16:Kafka 的零拷贝技术是如何提升性能的?
传统方式:磁盘 → 内核页缓存 → 应用缓冲区 → Socket 缓冲区 → 网卡(多次拷贝)。
零拷贝(sendfile):内核页缓存直接拷贝到 Socket 缓冲区,跳过用户态,减少 CPU 与内存拷贝次数。
💡加分:Kafka 还利用 PageCache 和顺序写提升性能。
Q17:RocketMQ 的同步刷盘与异步刷盘区别?
- 同步刷盘:消息写入磁盘后才返回 ACK,可靠性高,性能低。
- 异步刷盘:写入内存即返回,批量刷盘,性能高,但断电可能丢少量数据。
💡加分:金融核心业务用同步,日志等可容忍丢失用异步。
Q18:Kafka 的 KRaft 模式解决了什么问题?
移除 ZooKeeper,通过自研 Raft 共识管理元数据,优点:
- 减少组件,简化运维。
- 支持更多分区(百万级)。
- 避免 ZK 与 Kafka 版本兼容问题。
💡加分:KRaft 是 Kafka 迈向云原生的关键一步,Kafka 3.x+ 已可用于生产。
七、选型与演进篇
Q19:RocketMQ 和 Kafka 如何选型?
| 场景 | 推荐 | 理由 |
|---|---|---|
| 金融支付、订单交易 | RocketMQ | 事务消息、延时消息、死信队列,功能完善 |
| 日志采集、大数据分析 | Kafka | 超高吞吐、流式生态丰富(Kafka Streams、KSQL) |
| 简单异步任务 | 两者均可 | 根据运维成本选择 |
💡加分:RocketMQ 5.x 也支持云原生弹性,Kafka 通过 KRaft 降低运维成本,边界逐渐模糊。
Q20:消息队列未来趋势?
- Serverless 化:无需关心集群,按量付费(如 Confluent Cloud、阿里云 RocketMQ Serverless)。
- 多协议融合:MQTT(物联网)、AMQP 协议支持增强。
- AI 集成:消息队列与流计算结合,实现实时智能决策。
💡加分:2026 年,消息队列正向“事件驱动架构”的核心基础设施演进。
八、面试应答话术模板
- 原理题:先给结论,再展开细节(如“ISR 是同步副本集合,保证数据不丢失,具体机制是…”)。
- 方案题:分点回答,优先说紧急方案,再说长期优化。
- 对比题:使用表格对比,从设计理念、功能、性能、运维多维度分析。
- 故障排查:描述现象 → 分析原因(日志、监控)→ 解决方案 → 复盘改进。
九、练习题
- 故障模拟:用
kafka-consumer-groups模拟消费者长时间处理,触发 Rebalance,观察消费暂停与恢复过程。 - 设计题:订单系统要求 100% 不丢消息,且不允许重复消费,请给出 RocketMQ 生产端与消费端完整方案。
- 代码题:基于 RocketMQ 实现事务消息,模拟本地事务失败后的回查机制。
📊 你的学习进度
- 当前:第96篇 / 共108篇 ·进阶篇:缓存与消息队列(第91~96篇)
- ✅ 已完成:基础篇44篇 + 第91~96篇
- 📖 正在学:第96篇
- ⏳ 待学习:第97~108篇
👉 📚 完整目录 & 学习指南 | 🔥 订阅本专栏,不错过每一篇
💡 本专栏每篇都包含:避坑表 + 面试高频考点 + 练习题。每天30分钟,100天拿offer!
👉 下一篇文章预告
《第97篇:微服务架构演进》
内容简介:从单体到 SOA 再到微服务,剖析架构演进的驱动力与挑战,对比 Spring Cloud 与 Kubernetes 生态,解读服务网格(Istio)趋势。
💡 学完这篇,你将理解微服务本质,为后续组件(Nacos、Gateway)学习打下基础。
🎁福利提醒:评论区留言“MQ面试”可领取《消息队列面试高频题 PDF》完整版。
📌《Java 100 天进阶之路 | 从入门到上岗就业》每天一篇,建议收藏 + 关注,一起100天拿offer!
👉 点击关注我,更新后第一时间收到推送!
