🚀 RocketMQ 八股文面试总结
1. RocketMQ 的核心组成有哪些?
- NameServer:注册中心,保存 Broker 的路由信息,Producer/Consumer 从它获取路由信息。
- Broker:消息中转站,存储和转发消息。
- Producer:生产者,发送消息到 Broker。
- Consumer:消费者,从 Broker 拉取消息。
- Topic:消息的分类标识。
- MessageQueue:每个 Topic 下分为多个队列。
2. RocketMQ 的消息发送流程?
- Producer 启动并从 NameServer 获取 Topic 路由。
- 选择一个 Broker 和队列(轮询或 hash)。
- 向 Broker 发送消息。
- Broker 存储消息并返回结果。
3. RocketMQ 支持的消息类型有哪些?
- 同步消息(Sync) :发送后等待 Broker 响应,适用于重要通知。
- 异步消息(Async) :发送后注册回调,不阻塞主线程,适用于响应时间敏感业务。
- 单向消息(One-way) :只发送不关心结果,适用于日志收集等。
- 顺序消息:按顺序投递和消费,适用于订单流程等。
- 延迟消息:定时发送,支持固定延迟等级。
- 事务消息:用于分布式事务场景。
4. RocketMQ 的消息存储机制?
- 消息写入 CommitLog(顺序写磁盘),然后异步刷盘或同步刷盘。
- ConsumeQueue 是消费索引文件,存储消息偏移量等信息。
- IndexFile 是消息索引文件,支持通过 key 查找消息。
5. RocketMQ 的消费模式?
- 集群模式(Clustering) :多实例消费同一消息只会被一个实例消费。
- 广播模式(Broadcasting) :所有实例都消费一遍消息。
6. RocketMQ 如何实现顺序消息?
- 顺序消息关键在于 相同消息要进入同一个队列。
- Producer 使用
MessageQueueSelector
来选择队列。 - Consumer 设置为顺序消费,单线程顺序读取。
7. RocketMQ 如何保证消息不丢?
- 同步刷盘:消息写入磁盘才算成功。
- ACK 机制:Broker 返回写成功 Producer 才认为发送成功。
- Master-Slave 复制:防止主节点宕机导致数据丢失。
- 重试机制:发送失败自动重试。
- 消息重投:消费失败会重试消费。
8. RocketMQ 如何实现消息重试?
- 消费失败返回
ConsumeConcurrentlyStatus.RECONSUME_LATER
。 - Broker 会延迟重试,默认最多重试 16 次。
- 超过次数消息进入 死信队列(DLQ) 。
9. RocketMQ 的高可用如何实现?
- NameServer 多实例部署(无状态,互为备份)。
- Broker Master-Slave 架构,支持异步/同步复制。
- Producer/Consumer 端有重试和自动切换机制。
10. RocketMQ 的事务消息机制?
-
采用 两阶段提交。
- 发送半消息(暂不投递给消费者)。
- 执行业务逻辑。
- 根据业务执行结果,执行 commit 或 rollback。
-
提交失败由 Broker 回查(定时调用 Producer 的回查接口)。
11. RocketMQ 和 Kafka 的区别?
对比项 | RocketMQ | Kafka |
---|---|---|
消息模型 | 支持多种(事务、延迟、顺序) | 主要是日志流模型 |
存储机制 | CommitLog 顺序写 | 基于 segment files |
高可用架构 | Master-Slave | 多副本 + 控制器 |
消息顺序 | 原生支持顺序消息 | 要靠单分区才能实现 |
延迟消息 | 支持(内置 delayLevel) | 需要配合定时任务实现 |
社区活跃度 | 阿里主导,开源度高 | 社区更活跃,生态丰富 |
12. 如何避免消息重复消费?
- 消费端需做 幂等性设计(如:唯一事务编号 + 去重表)。
- 使用业务主键做幂等判断。
- RocketMQ 本身不能 100% 保证不重复,只能保证 至少一次。