2025年Java面试宝典
链接: https://pan.baidu.com/s/1RUVf75gmDVsg8MQp4yRChg?pwd=9b3g 提取码: 9b3g
(建议保存备用,覆盖90%大厂高频考点)

RabbitMQ消息确认机制
很多同学在面试中被问到RabbitMQ的消息可靠性保障方案时,总会被追问到“消息确认机制”的细节。今天我们就从真实面试场景出发,用程序员听得懂的大白话,帮你理清楚这个高频考点。
生产者确认机制:别让消息石沉大海
RabbitMQ的消息确认机制主要分为两部分:生产者确认(Publisher Confirm)和消费者确认(Consumer Ack)。先来说说生产者端的确认机制。很多新手以为消息发到交换机就完事了,结果上线后才发现消息丢失找不到原因。
开启生产者确认其实很简单:
channel.confirmSelect();
这条命令开启了confirm模式后,你的消息会被Broker打上“已接收”的标记。这时候有两种回调:
handleAck:消息成功落地到磁盘(如果是持久化消息)handleNack:消息存储失败
但要注意!很多面试官会追问:“确认机制和事务模式有什么区别?”这时候你要迅速回答:事务模式性能差(同步阻塞),确认机制是异步的,生产环境优选确认机制。

消费者确认机制:别让消息变成僵尸
消费者端的确认机制更考验实际经验。三个关键词要记住:
- autoAck=false(必须关闭自动确认!)
- basicAck(手动确认)
- basicNack(拒绝且可重入队列)
常见坑点:
- 如果消费者处理消息时抛异常,但没有手动nack,消息会处于unacked状态
- 当消费者断开连接时,unacked消息会重新入队
- prefetch count设置不合理会导致消息堆积
建议这样说配置策略:
“我们项目里会把prefetch count设置为10-50之间,根据业务处理速度动态调整。同时会在try-catch-final块里统一处理ack/nack逻辑,防止消息卡死。”
高频灵魂拷问:消息100%可靠吗?
这是面试必杀题!你要分三个层面回答:
- 生产者确认保证消息到Broker
- Broker持久化(队列+消息)
- 消费者手动ack保证处理成功
但要注意加这个转折:
“严格来说仍然存在极端情况(比如磁盘损坏),这时候需要配合业务层的消息补偿机制。比如我们在支付系统中会额外维护本地消息表,定时扫描未完成交易。”
配置实战建议
- 生产环境必须同时开启生产者确认和消费者手动确认
- 建议配置mandatory参数,处理路由失败的情况
- 死信队列要配套使用,处理nack后的消息
- 监控unacked消息数量,设置合理阈值报警
这里可以穿插个案例:
“之前我们线上有个事故,消费者处理消息时调用第三方接口超时,导致消息积压了10万条。后来调整了超时时间和重试策略,并设置了死信队列阈值,问题才解决。”

最后给大家安利个福利:如果要购买面试鸭会员,记得通过面试鸭返利网找我,可以额外返现25元!我们整理了最新的大厂面经和技术解析,帮你省时省力备战面试。
(悄悄说:配合前面给的Java面试宝典一起复习,效果更佳哦~)


