|
| 1 | +--- |
| 2 | +title: 2026 最新消息队列面试题总结:可靠性、幂等、顺序、积压与选型 |
| 3 | +description: 2026 最新消息队列面试题和复习路线,覆盖异步、解耦、削峰、消息可靠性、重复消费、幂等、顺序消息、消息积压、Kafka、RocketMQ、RabbitMQ 和技术选型等高频考点。 |
| 4 | +category: 高性能 |
| 5 | +tag: |
| 6 | + - 消息队列 |
| 7 | + - 面试题 |
| 8 | + - 高性能 |
| 9 | +head: |
| 10 | + - - meta |
| 11 | + - name: keywords |
| 12 | + content: 消息队列面试题,MQ面试题,消息可靠性,重复消费,消息幂等,顺序消息,消息积压,Kafka面试题,RocketMQ面试题,RabbitMQ面试题,消息队列选型 |
| 13 | +--- |
| 14 | + |
| 15 | +消息队列面试通常从“为什么使用 MQ”开始,随后沿着一条消息的生命周期继续追问:生产者发送超时后能不能重试?Broker 返回成功是否代表消息不会丢?消费者处理成功但确认失败会发生什么?重复消费、顺序错乱和消息积压又该怎样处理? |
| 16 | + |
| 17 | +这篇文章是 JavaGuide 消息队列专题的复习入口,按使用场景、消息可靠性、主流中间件和技术选型四部分整理。每部分只列复习时需要抓住的问题,完整答案和实现细节放在对应专题文章中。 |
| 18 | + |
| 19 | +时间比较紧的话,可以先看面试突击版的[消息队列常见面试题总结](https://interview.javaguide.cn/high-performance/message-queue-interview-questions.html),把讲不清楚的问题标出来,再回到本文补原理和工程细节。 |
| 20 | + |
| 21 | +## 复习时先抓住哪些问题? |
| 22 | + |
| 23 | +| 模块 | 需要讲清楚的内容 | 常见追问方向 | |
| 24 | +| -------------- | ------------------------------------------------------ | ------------------------------------------------------- | |
| 25 | +| 使用场景与限制 | 为什么使用 MQ,哪些链路不适合改成异步 | 异步、解耦、削峰、最终一致性、RPC 与 MQ | |
| 26 | +| 可靠性与语义 | 消息从生产到消费的每个环节怎样确认、重试和恢复 | 消息丢失、重复消费、幂等、顺序、重试、死信、积压 | |
| 27 | +| 中间件原理 | 主流 MQ 怎样组织消息、复制数据并协调消费者 | Kafka、RocketMQ、RabbitMQ、分区、副本、消费组、确认机制 | |
| 28 | +| 选型与治理 | 怎样结合业务能力、运维经验和故障目标选择并管理消息队列 | 吞吐、延迟、回放、事务消息、监控、扩容、容灾、Disruptor | |
| 29 | + |
| 30 | +回答消息可靠性问题时,不能只报一个配置项。生产者确认、Broker 持久化与复制、消费者确认、业务幂等和补偿对账需要一起说明;任何一段处理不完整,都可能表现为消息丢失、重复或结果不一致。 |
| 31 | + |
| 32 | +## 消息队列基础与使用限制 |
| 33 | + |
| 34 | +消息队列把生产者和消费者之间的同步调用改成异步消息传递。主链路可以更快返回,突发流量也能暂存在 Broker 中,但系统同时增加了消息中间件、异步状态和故障恢复流程。 |
| 35 | + |
| 36 | + |
| 37 | + |
| 38 | +相关内容: |
| 39 | + |
| 40 | +- [消息队列基础知识总结](./message-queue.md) |
| 41 | +- [高性能系统设计面试题总结](../high-performance-system-interview-questions.md) |
| 42 | + |
| 43 | +常见面试题: |
| 44 | + |
| 45 | +- 消息队列怎样实现异步、应用解耦和削峰填谷? |
| 46 | +- 引入消息队列后,系统复杂度和数据一致性会发生什么变化? |
| 47 | +- 哪些业务适合异步处理?支付结果、库存扣减等强实时链路能否直接异步化? |
| 48 | +- RPC 和消息队列在通信方向、响应时效、耦合方式和故障处理上有什么区别? |
| 49 | +- 点对点和发布订阅模型分别适合什么场景? |
| 50 | +- 为什么不能把消息写入 MQ 就立即向用户返回“业务成功”? |
| 51 | + |
| 52 | +回答“为什么使用 MQ”时,最好结合一个具体流程。例如订单创建后,哪些步骤必须同步完成,哪些通知、积分和风控任务可以异步处理;消费者失败时,用户看到的状态和后台补偿又怎样衔接。 |
| 53 | + |
| 54 | +## 消息可靠性与消费语义 |
| 55 | + |
| 56 | +消息可靠性可以沿着生产者、Broker、消费者和业务处理四段来回答。生产者要确认消息是否被接收,Broker 要考虑持久化与副本,消费者要在业务完成后确认,业务侧还要处理重复和结果不确定。 |
| 57 | + |
| 58 | + |
| 59 | + |
| 60 | +相关内容: |
| 61 | + |
| 62 | +- [消息队列基础知识总结](./message-queue.md) |
| 63 | +- [Kafka 常见问题总结](./kafka-questions-01.md) |
| 64 | +- [RocketMQ 常见问题总结](./rocketmq-questions.md) |
| 65 | +- [RabbitMQ 常见问题总结](./rabbitmq-questions.md) |
| 66 | + |
| 67 | +常见面试题: |
| 68 | + |
| 69 | +- At Most Once、At Least Once 和 Exactly Once 分别表示什么? |
| 70 | +- 一条消息在哪些环节可能丢失?每个环节怎样降低风险? |
| 71 | +- 为什么 At Least Once 容易产生重复消息?消费者如何保证业务幂等? |
| 72 | +- 消息 ID 去重为什么不能完全代替业务唯一键? |
| 73 | +- 怎样保证同一订单或同一用户的消息按顺序处理? |
| 74 | +- 消费失败后,哪些错误适合重试,哪些消息应该进入死信队列? |
| 75 | +- 消息积压时,怎样区分生产流量突增、消费者变慢、分区不足和下游故障? |
| 76 | + |
| 77 | +顺序、可靠性和吞吐往往相互影响。同一业务键固定到一个队列或分区可以保证局部顺序,但也会限制并行度;同步刷盘和更多副本能够降低数据丢失风险,同时会增加写入延迟和资源开销。 |
| 78 | + |
| 79 | +## Kafka 高频问题 |
| 80 | + |
| 81 | +Kafka 的高频题主要围绕分区、副本、消费组、可靠性和高吞吐设计展开。回答时要把 Producer、Broker、Partition、Replica、Consumer Group 和 Offset 放到同一条读写链路中。 |
| 82 | + |
| 83 | + |
| 84 | + |
| 85 | +相关内容:[Kafka 常见问题总结](./kafka-questions-01.md) |
| 86 | + |
| 87 | +常见面试题: |
| 88 | + |
| 89 | +- Topic、Partition、Replica、Consumer Group 和 Offset 分别承担什么职责? |
| 90 | +- Kafka 为什么只能保证单个 Partition 内有序?业务 Key 应该怎样选择? |
| 91 | +- Leader、Follower、ISR、HW 和 LEO 之间是什么关系? |
| 92 | +- `acks=all`、副本数和 `min.insync.replicas` 应该怎样配合? |
| 93 | +- Kafka 为什么吞吐量高?顺序写、Page Cache、零拷贝、批处理和压缩分别起什么作用? |
| 94 | +- Kafka 的幂等生产者和事务解决了什么问题?Exactly Once 能否覆盖外部数据库? |
| 95 | +- Kafka 4.0 为什么只支持 KRaft?它和早期 ZooKeeper 模式有什么区别? |
| 96 | +- Rebalance 会带来哪些影响?怎样减少不必要的重平衡? |
| 97 | + |
| 98 | +Kafka 参数不能孤立记忆。比如 `acks=all` 等待的是当前 ISR 中满足条件的副本确认,不等于所有配置副本都已经落盘;消费成功后何时提交 Offset,也会直接影响重复消费和消息丢失风险。 |
| 99 | + |
| 100 | +## RocketMQ 高频问题 |
| 101 | + |
| 102 | +RocketMQ 面试通常更贴近业务消息场景,事务消息、延时消息、顺序消息和消息存储是常见追问。复习时可以从消息怎样经过 NameServer、Producer、Broker 和 Consumer 开始,再进入 CommitLog、ConsumeQueue 和刷盘复制机制。 |
| 103 | + |
| 104 | +相关内容:[RocketMQ 常见问题总结](./rocketmq-questions.md) |
| 105 | + |
| 106 | +常见面试题: |
| 107 | + |
| 108 | +- NameServer、Broker、Producer、Consumer 和 Proxy 分别负责什么? |
| 109 | +- NameServer 节点之间不通信,怎样提供路由发现能力? |
| 110 | +- CommitLog、ConsumeQueue 和 IndexFile 分别保存什么数据? |
| 111 | +- RocketMQ 事务消息中的半消息、提交、回滚和事务回查怎样配合? |
| 112 | +- 延时消息和定时消息适合哪些场景?消费者为什么仍要检查业务状态? |
| 113 | +- RocketMQ 怎样保证同一业务分组内的消息有序? |
| 114 | +- 同步刷盘、异步刷盘、同步复制和异步复制分别影响什么? |
| 115 | +- 消息堆积后,增加消费者为什么不一定能提高处理速度? |
| 116 | + |
| 117 | +事务消息解决本地事务与消息发送之间的协调,不能替消费者完成幂等和补偿。Broker 回查得到的仍然是生产者本地事务状态,消费者重复执行、下游失败和业务对账需要另行处理。 |
| 118 | + |
| 119 | +## RabbitMQ 高频问题 |
| 120 | + |
| 121 | +RabbitMQ 重点考察 AMQP 路由模型、确认机制、死信与延迟队列,以及不同队列类型的可靠性。Exchange、Routing Key、Binding 和 Queue 的关系必须先讲清楚。 |
| 122 | + |
| 123 | + |
| 124 | + |
| 125 | +相关内容:[RabbitMQ 常见问题总结](./rabbitmq-questions.md) |
| 126 | + |
| 127 | +常见面试题: |
| 128 | + |
| 129 | +- direct、fanout、topic 和 headers Exchange 分别怎样路由消息? |
| 130 | +- Publisher Confirms 能确认到哪个环节?消息无法路由到队列时怎样发现? |
| 131 | +- 持久化 Exchange、Queue 和 Message 是否足以保证消息不丢? |
| 132 | +- 手动 ACK、NACK、重新入队、重试和死信队列怎样配合? |
| 133 | +- TTL 加死信交换器实现延迟消息时,为什么可能出现队头阻塞? |
| 134 | +- Classic Queue、Quorum Queue 和 Stream 分别适合什么场景? |
| 135 | +- RabbitMQ 集群部署多个节点,是否意味着队列消息已经拥有副本? |
| 136 | +- Ready、Unacked、消息年龄、确认速率和副本状态应该怎样监控? |
| 137 | + |
| 138 | +Publisher Confirm 只说明 Broker 已经处理这次发布,消息是否进入目标业务队列还要看路由结果。消费者确认也只能说明消费端接受了处理结果,业务数据库是否正确写入仍需由事务、幂等和补偿保证。 |
| 139 | + |
| 140 | +## 消息队列选型与项目追问 |
| 141 | + |
| 142 | +选型时先确认业务需要什么消息语义,再看团队是否具备对应的部署和故障处理经验。只比较单机吞吐量,很难得到可靠结论。 |
| 143 | + |
| 144 | +相关内容: |
| 145 | + |
| 146 | +- [消息队列基础知识总结](./message-queue.md) |
| 147 | +- [Disruptor 常见问题总结](./disruptor-questions.md) |
| 148 | + |
| 149 | +常见面试题: |
| 150 | + |
| 151 | +- Kafka、RocketMQ 和 RabbitMQ 在消息模型、吞吐、延迟、回放和运维上有什么区别? |
| 152 | +- 日志流、订单事件、复杂路由和延时任务分别适合哪类产品? |
| 153 | +- 公司已经稳定运行一种 MQ 时,什么情况下值得引入另一种产品? |
| 154 | +- 消息队列应该监控哪些生产、存储、消费和业务指标? |
| 155 | +- Broker、消费者或下游依赖故障后,系统怎样降级和恢复? |
| 156 | +- Disruptor 和分布式消息队列有什么区别? |
| 157 | + |
| 158 | +项目追问通常会落到具体数字和异常处理:峰值生产速率、消费延迟、分区或队列数量、消息保留时间、最大重试次数、积压告警阈值和故障恢复过程。没有参与过的配置和事故按学习结果回答即可,不要编造线上数据。 |
| 159 | + |
| 160 | +## 按准备时间安排复习 |
| 161 | + |
| 162 | +| 剩余时间 | 建议安排 | 复习目标 | |
| 163 | +| -------- | -------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------- | |
| 164 | +| 1~2 天 | 先过一遍[消息队列常见面试题总结](https://interview.javaguide.cn/high-performance/message-queue-interview-questions.html),优先补可靠性、幂等、顺序和积压 | 能沿消息生命周期回答高频问题 | |
| 165 | +| 3~7 天 | 在通用问题之外,重点学习项目实际使用的一种 MQ,再补另外两种产品的定位和主要差异 | 能回答产品原理、异常处理和选型追问 | |
| 166 | +| 1 周以上 | 按本文顺序阅读专题文章,画出生产、存储、复制、消费、确认和补偿链路,并结合项目整理监控与故障恢复过程 | 能从业务要求讲到配置、取舍和运维 | |
| 167 | + |
| 168 | +<!-- @include: @article-footer.snippet.md --> |
0 commit comments