RocketMq 面试题

张开发
2026/4/16 15:03:21 15 分钟阅读

分享文章

RocketMq 面试题
RocketMQ 消息重复怎么解决面试标准答案一、为什么会重复面试必说生产者发送时网络波动Broker 已收到但生产者没收到 ACK会重试发送。消费者处理完业务但还没提交 ACK就挂了/重启了Broker 认为没消费会重新投递。重平衡、队列重新分配时也可能出现重复。二、核心解决方案消费端做幂等1. 数据库唯一索引 / 唯一约束首选用业务唯一键订单号、用户ID业务号、消息ID建唯一索引。重复消息插入时会报主键冲突直接捕获异常跳过。2. 状态机判断适合订单/支付类 次选比如订单状态待支付 → 已支付。如果已经是“已支付”重复消息直接忽略。3. 备选本地Redis 简易去重高频秒杀/高并发用业务唯一key设短期Redis缓存过期时间消费前setnx成功则处理失败直接丢弃只是做标记去重不加分布式锁、不做续期只是简单原子判重不是抢占锁轻量化4. 分布式锁Redis/Redisson 生产不用消费前用messageId / 业务唯一号加锁。拿到锁才执行业务没拿到锁说明已处理直接丢弃。RocketMQ 如何保证消息可靠性面试满分答案1. 生产者端确保消息发送成功同步发送sync等待 Broker 确认返回失败立即重试最可靠。重试机制发送失败自动重试配置重试次数retryTimes3与超时。事务消息保证本地事务 消息发送原子性解决分布式事务一致性。失败回调 落盘极端失败可本地日志/DB 记录人工/定时任务补偿。2. Broker 端消息不丢失、不宕机就不丢同步刷盘SYNC_FLUSH消息写入磁盘才返回 ACK保证机器断电不丢。主从架构 集群部署Master-Slave主节点挂了从节点顶上保证高可用。同步复制SYNC_MASTER消息同时写入 Master Slave 才确认成功最可靠。消息持久化消息持久化到磁盘重启不丢失。磁盘空间保护配置过期清理防止满盘丢消息3. 消费者端确保真正消费成功确认机制ACK消费者处理完业务手动提交 ACKBroker 才标记已消费。重试机制消费超时/异常 → 不捕获异常抛出异常触发重试避免因业务异常丢消息。死信队列DLQ多次重试失败进入死信队列人工排查处理不丢弃任何消息。幂等性保证消费端用唯一消息ID做去重避免重复消费带来问题。合理设置重试间隔避免风暴失败逐级退避RocketMQ 存储机制 面试标准答案结构化、逻辑清晰我会按照面试高频考点从核心设计、存储结构、读写流程、刷盘机制、文件过期删除五大维度结构化回答逻辑清晰、直击重点。一、RocketMQ 存储核心设计理念完全基于文件系统存储不依赖数据库纯本地磁盘序列化存储**** 顺序写、随机读**极致优化磁盘IO性能**三大核心文件分工协作CommitLog、ConsumeQueue、IndexFile内存映射MMAP加速文件读写减少用户态/内核态切换文件固定长度预分配避免磁盘碎片提升IO效率二、RocketMQ 三大核心存储文件必背1. CommitLog消息主体存储文件作用存储消息完整数据主题、队列、内容、属性等特点所有主题、所有队列的消息全局混写严格顺序追加单文件固定大小1GB写满自动创建新文件是 RocketMQ 唯一的真实数据文件路径${storePath}/commitlog/000000000000000000002. ConsumeQueue消费队列/逻辑队列作用消息索引文件给消费者使用加速消息查找特点按主题队列维度拆分每个队列一个文件不存消息体只存 3 个核心字段CommitLog偏移量(8B) 消息长度(4B) 消息Tag哈希(8B)单条记录固定20字节单文件默认 30W 条固定大小 600KB属于逻辑索引数据丢失可从 CommitLog 重建路径${storePath}/consumequeue/主题/队列号/文件名3. IndexFile索引文件作用提供消息key、消息offset的快速查询特点供后台管理、消息查询使用不影响核心收发基于哈希槽链表实现单文件固定 400MB路径${storePath}/index/文件名三、消息写入 消费读取 完整流程高频核心1. 消息写入流程生产者生产者发送消息到 BrokerBroker 直接顺序写入 CommitLog全局顺序追加写入成功后异步转发给ReputMessageService线程后台线程构建构建当前主题队列的ConsumeQueue 索引构建IndexFile 索引同步/异步刷盘返回 ACK 给生产者关键点写入只有一条全局顺序流保证高性能2. 消息读取流程消费者消费者从ConsumeQueue读取索引根据索引中的CommitLog 偏移量直接去 CommitLog 中随机读取完整消息返回消息给消费者关键点消费读索引再读真实数据兼顾速度与存储成本四、刷盘机制持久化机制RocketMQ 通过内存映射文件 刷盘策略保证消息不丢失。1. 同步刷盘SYNC_FLUSH消息写入内存后立即同步刷写到磁盘刷盘成功才返回生产者 ACK优点消息绝对不丢失缺点性能较低适用于金融、交易等核心场景2. 异步刷盘ASYNC_FLUSH消息写入内存后立即返回成功后台线程定时批量刷盘默认 500ms优点高性能、高吞吐缺点Broker 意外宕机可能丢失少量消息默认配置RocketMQ 默认使用异步刷盘五、文件过期与删除机制过期策略默认文件保留72小时可配置删除触发定时任务每隔 10s 扫描文件最后更新时间 过期时间且不再使用空间保护磁盘使用率达到 85% 自动开始删除达到 90% 强制删除避免磁盘爆满规则只删除旧的 CommitLog同时删除对应 ConsumeQueue六、总结面试收尾一句话RocketMQ 采用**「CommitLog 全局顺序写 ConsumeQueue 索引读」的混合存储架构通过顺序写保证高性能、索引文件保证随机读效率、灵活刷盘机制兼顾可靠性与吞吐**是高吞吐、高可靠消息队列的核心设计。面试加分项可主动补充零拷贝使用mmap sendfile减少内核态拷贝文件预分配避免实时创建文件导致IO抖动ConsumeQueue 极小可全部缓存内存消费极快高可用主从同步复制配合刷盘实现消息不丢失如果需要我可以再给你整理RocketMQ存储高频面试题陷阱题直接背会就能面试通关

更多文章