消息丢失、重复和积压是MQ面试必考三大难题,本文深度解析RabbitMQ/Kafka实战解决方案。从生产者确认机制到消费者幂等设计,全面覆盖消息可靠性保障方案,包含代码示例和架构图。学习如何通过本地消息表、手动ACK、唯一约束等技术手段解决分布式系统消息问题,掌握消息积压时的紧急扩容与降级策略。附赠2025最新Java面试宝典下载,助你轻松应对大厂技术考察,提升分布式系统架构能力。
(附:2025 Java面试宝典下载)
面试官最爱问MQ问题,尤其消息丢失、消息重复、消息积压三大痛点。搞不定这些,分布式系统根本玩不转。今天咱们用实战思路拆解解决方案!

消息中间件核心问题示意图
核心原因:生产者到MQ、MQ持久化、消费者处理 这三个环节都可能丢数据。
生产者端双重保险
confirm机制(RabbitMQ)或ACK(Kafka)MQ持久化别偷懒
// 错误示范(RabbitMQ)
channel.basicPublish("", "non-persistent-queue", null, message.getBytes());
// 正确姿势
AMQP.BasicProperties props = new AMQP.BasicProperties.Builder().deliveryMode(2).build();
channel.basicPublish("", "persistent-queue", props, message.getBytes());
消费者手动ACK
关掉自动提交(Kafka的enable.auto.commit=false),业务逻辑成功后才提交offset
根本原因:网络重发、消费者重启、offset提交延迟都会导致消息重复。
幂等设计是底线
SETNX做防重(key=业务标识+消息ID)MQ自带去重神器
MessageId或业务键去重enable.idempotence=true)版本号控制
给消息加版本号,旧版本直接丢弃:
UPDATE order SET status=‘paid’, version=3 WHERE id=100 AND version=2;

消息积压紧急处理流程
快速扩容消费者
降级非核心业务
死信队列转移战场
把积压消息转到新Topic,用离线集群慢慢消化
终极手段:消息回溯
Kafka重置offset到最早位置(慎用!可能重复消费)
📌 加分技巧:举例说明你在项目中如何落地这些方案,比如:"我们订单系统用Redis的
SETNX实现了毫秒级去重"

记住:解决消息丢失靠确认机制,解决消息重复靠幂等设计,搞定消息积压靠弹性扩缩容。把这套方法论吃透,面试官绝对眼前一亮!
扫码联系我返利
(当前返利8元,金额随官方实际价格波动,最好提前咨询)

面试鸭小程序码

美团大额优惠券,给自己加个鸡腿吧!

支付宝扫码领取1-8元无门槛红包
