1. RocketMQ 的核心架构?

🎯 面试要点

  • 对比 Kafka:RocketMQ 的"队列"概念(一个 Topic 多队列)类似分区;NameServer 类似轻量 ZK
  • CommitLog + ConsumeQueue 双写设计是"顺序写高吞吐 + 随机读也快"的关键
  • RocketMQ 是阿里开源、Java 实现、功能丰富(事务/延迟/顺序都内置)

2. RocketMQ 事务消息原理?(解决本地事务与发消息原子性)

要解决的问题:先写库再发消息(库成功消息失败 → 下游没收到);先发消息再写库(消息成功库失败 → 下游收到不存在的业务)。

两阶段 + 回查:

  1. 半消息(half message):生产者先发送"半消息"(消费者不可见,暂存)
  2. 执行本地事务:半消息发送成功后,执行本地事务(写库)
  3. 提交或回滚:本地事务成功 → commit 半消息(消费者可见);失败 → rollback(消息丢弃)
  4. 事务回查:若第 3 步因宕机丢失,Broker 会回调查询本地事务状态(checkLocalTransaction)决定 commit/rollback——保证最终一致
事务消息 API 要点
TransactionMQProducer producer = new TransactionMQProducer("group");
producer.setTransactionListener(new TransactionListener() {
    @Override public LocalTransactionState executeLocalTransaction(Message msg, Object arg) {
        return doBizAndReturnState();      // ① 本地事务,返回 COMMIT/ROLLBACK/UNKNOW
    }
    @Override public LocalTransactionState checkLocalTransaction(MessageExt msg) {
        return queryBizStatusAndReturn();   // ② 回查(Broker 调用)
    }
});

🎯 面试要点

  • 对比本地消息表:事务消息把"记录 + 发送"搬进了 MQ 内部(半消息 = 待确认消息)
  • 回查机制保证"不确定状态"最终确定——最终一致性

3. 延迟消息怎么实现?

延迟消息用法
Message msg = new Message("order-timeout", body);
msg.setDelayTimeLevel(15);     // 15 = 10 分钟(索引从 1 开始)
producer.send(msg);

🎯 面试要点

  • 面试延伸:订单超时关闭的多种方案(定时任务轮询 / 延迟队列 / Redis 过期监听——延迟队列最优雅)
  • 任意精度延迟需自研时间轮(Kafka 的 TimerWheel)

4. RocketMQ 的顺序消息/广播/死信?

🎯 面试要点

  • 死信队列是 MQ 可靠性的最后一环,面试讲"失败兜底"必提
  • Tag 过滤:一个 Topic 多业务用 Tag 区分,比拆 Topic 轻量

🎤 常见面试追问

  1. 事务消息的原理(必背)?——发送"半消息"(消费者不可见)→ 执行本地事务 → 成功 commit / 失败 rollback → 若第 3 步丢失,Broker 回查(checkLocalTransaction)最终确定。解决"写库和发消息的原子性"。
  2. 延迟消息怎么实现?——18 个固定延迟级别(1s~2h),消息按级别进对应延迟队列,定时任务扫描到期转投真实队列。订单超时关单(30 分钟)是经典应用。
  3. RocketMQ 为什么比 Kafka 功能全?——Java 生态深耕业务场景:事务消息、延迟消息、顺序消息、Tag 过滤、死信队列开箱即用;Kafka 强在吞吐和大数据生态(Flink)。
  4. CommitLog + ConsumeQueue 双写设计?——所有消息顺序写一个 CommitLog(高吞吐),每个队列建定长 ConsumeQueue 索引——顺序写 + 快速定位两全。
  5. 消费重试 16 次后去哪?——进死信队列(%DLQ%),人工/脚本处理——保证"处理不了的消息不丢不循环"。

📖 名词解释(本页术语)

术语 大白话解释
RocketMQ阿里开源、Java 实现的业务消息中间件:事务/延迟/顺序消息开箱即用。
NameServerRocketMQ 的注册中心:Broker 注册路由,客户端拉取(轻量、可多台)。
半消息(Half Message)事务消息第一阶段发的"待定消息":先暂存,本地事务成功后 commit 才可见。
事务回查半消息状态丢失时 Broker 回调 checkLocalTransaction 问"本地事务到底成没成"——最终一致的保障。
延迟级别(DelayLevel)18 个固定延迟档位(1s/5s/…/2h),setDelayTimeLevel 使用。
MessageQueueRocketMQ 的队列(类似 Kafka 分区):一个 Topic 多个队列,并行度来源。
Tag消息的轻量分类标签:一个 Topic 内按 Tag 过滤(比拆 Topic 轻量)。
⚠️ 本页面由 AI 生成,内容仅供参考,请以官方文档和实际源码为准。