发布时间:2026/9/6 17:16:50
RabbitMQ如何保证消息不丢失 RabbitMQ 保证消息不丢失需要从‌生产者、Broker、消费者‌三个核心环节同时配置缺一不可核心是开启持久化、生产者确认和消费者手动ACK机制。一RabbitMQ如何保证消息不丢失一、生产者端确保消息成功送达Broker‌开启生产者确认机制‌发送消息后等待Broker返回ACK确认收到NACK或超时未回调时自动重试。‌设置消息回退回调‌当消息无法路由到队列时触发通知执行补偿处理避免静默丢失。二、Broker端确保消息持久化存储不丢失三重持久化配置‌交换机设置durabletrue、队列设置durabletrue、消息设置deliveryMode2将消息写入磁盘。‌高可用部署‌使用镜像队列或Quorum队列将消息同步到多节点避免单节点故障导致永久丢失。三、消费者端确保消息处理完成再确认‌关闭自动ACK‌改为手动确认模式业务逻辑处理成功后再调用basicAck发送确认信号。‌失败异常处理‌处理失败时调用basicNack将消息重新入队或转入死信队列单独处理避免消息直接丢弃。RabbitMQ消息不丢失的三个核心环节生产者确认、Broker持久化、消费者手动ACK二基于 ‌Spring Boot‌ 环境的完整配置代码与实现方案。一、application.yml 核心配置这是实现消息可靠性的基础必须开启生产者确认和消费者手动ACK。spring:rabbitmq:host:localhostport:5672username:guestpassword:guest# 1. 生产者确认机制correlated 表示异步回调确认publisher-confirm-type:correlated# 2. 消息回退机制当消息无法路由到队列时触发publisher-returns:truelistener:simple:# 3. 消费者手动ACK模式acknowledge-mode:manual# 4. 消费失败重试策略可选retry:enabled:truemax-attempts:3二、生产者端发送确认与回退处理通过实现 RabbitTemplate.ConfirmCallback 和 ReturnCallback 接口确保消息成功到达交换机并路由到队列。importorg.springframework.amqp.rabbit.core.RabbitTemplate;importorg.springframework.amqp.support.CorrelationData;importorg.springframework.stereotype.Component;importjavax.annotation.PostConstruct;importjavax.annotation.Resource;ComponentpublicclassReliableProducer{ResourceprivateRabbitTemplaterabbitTemplate;PostConstructpublicvoidinit(){// 设置确认回调rabbitTemplate.setConfirmCallback((correlation,ack,cause)-{if(ack){System.out.println(消息成功送达Broker: correlation);}else{System.err.println(消息送达Broker失败原因: cause);// 执行重试或记录日志}});// 设置回退回调仅当消息无法路由到队列时触发rabbitTemplate.setReturnsCallback(returned-{System.err.println(消息路由失败退回消息: returned.getMessage());// 执行补偿逻辑如存入数据库或死信队列});}publicvoidsendMessage(Stringexchange,StringroutingKey,Objectmessage){rabbitTemplate.convertAndSend(exchange,routingKey,message);}}三、消费者端手动ACK与异常处理在监听器中通过 Channel 手动发送ACK或NACK确保业务逻辑执行成功后才确认消息importcom.rabbitmq.client.Channel;importorg.springframework.amqp.core.Message;importorg.springframework.amqp.rabbit.annotation.RabbitListener;importorg.springframework.stereotype.Component;importjava.io.IOException;ComponentpublicclassReliableConsumer{RabbitListener(queuesmy_queue)publicvoidhandleMessage(Messagemessage,Channelchannel)throwsIOException{longdeliveryTagmessage.getMessageProperties().getDeliveryTag();try{// 1. 执行业务逻辑System.out.println(收到消息: newString(message.getBody()));// 模拟业务处理...// 2. 业务成功手动ACKchannel.basicAck(deliveryTag,false);}catch(Exceptione){// 3. 业务失败手动NACK并重新入队requeuetrue// 注意若一直失败会导致死循环建议配合重试次数或转入死信队列channel.basicNack(deliveryTag,false,true);System.err.println(消息处理失败重新入队: e.getMessage());}}}四、Broker端队列与消息持久化配置在创建队列和发送消息时必须显式声明持久化属性。importorg.springframework.amqp.core.*;importorg.springframework.context.annotation.Bean;importorg.springframework.context.annotation.Configuration;ConfigurationpublicclassRabbitConfig{// 1. 定义持久化交换机BeanpublicDirectExchangedirectExchange(){returnnewDirectExchange(my_exchange,true,false);}// 2. 定义持久化队列BeanpublicQueuequeue(){returnnewQueue(my_queue,true);// durabletrue}// 3. 绑定关系BeanpublicBindingbinding(DirectExchangeexchange,Queuequeue){returnBindingBuilder.bind(queue).to(exchange).with(my_routing_key);}// 4. 发送消息时设置持久化模式 (Spring Boot 默认即为 PERSISTENT)// 若需自定义可在 convertAndSend 时传入 MessagePostProcessor}五、关键注意事项性能权衡‌开启生产者确认和持久化会略微降低吞吐量但在金融、订单等核心场景中是必须的。死信队列‌对于多次重试仍失败的消息应配置 TTL 和死信交换机DLX避免阻塞正常业务。幂等性‌由于网络抖动可能导致消息重复投递消费者端必须结合之前讨论的‌幂等性设计‌如Redis去重或数据库唯一索引来处理重复消息。

相关新闻

2026/9/1 12:27:09

HDI综合效益优势-平衡小型化、迭代效率与长期量产成本

绝大多数硬件工程师对比方案时,习惯于直接对比 PCB 单片价格,认为 HDI 工艺收费更高,优先选用传统通孔多层板。但单纯对比裸板单价存在明显局限性,PCB 成本只是产品总成本的一环,还要纳入整机结构、元器件、组装良率、…

2026/9/6 17:13:03

大功率激光二极管脉冲电源设计:从原理到调试的完整指南

简介:这是一份大功率激光二极管脉冲电源设计的完整Word设计文档,面向电力电子、激光应用及相关专业的工程师、科研人员与高年级学生。文档系统化梳理LD驱动电源的工作原理,明确其对激光二极管驱动、控制和保护的核心作用;同时依据…

2026/9/6 17:13:03

YOLO11cls血细胞分类实战:从数据整理到双阈值校验

简介:面向癌症检测与血细胞分类场景的医疗图像数据集资源,已按文件夹整理好 basophil、erythroblast、monocyte、myeloblast、seg_neutrophil 五个类别的真实血细胞图片,标注质量较高,可直接用于 YOLO11cls 等目标分类算法的训练与…

2026/9/6 17:13:03

基于STM32的农作物生长管理系统实战:从硬件选型到调试排障

简介:一份基于STM32微控制器的智能农作物生长管理系统项目设计文档,面向物联网农业应用场景,适合嵌入式开发、物联网实训及农业信息化方向读者。资源包为单个PDF文档,容量约52MB,全文按实际工程项目流程编排&#xff0…

2026/9/6 17:13:03

Flipper Zero Unleashed 固件第三方应用 FAP 安装完整避坑指南

Flipper Zero Unleashed 固件第三方应用 FAP 安装完整避坑指南 【免费下载链接】unleashed-firmware Flipper Zero Unleashed Firmware 项目地址: https://gitcode.com/GitHub_Trending/un/unleashed-firmware 想给 Flipper Zero 加个内置菜单里没有的功能,却…

2026/9/6 0:06:59

超人会飞不算本事:系统稳定依赖清晰规则与边界设计

开头先不绕弯子。“#斯坦李吐槽dc 所以超人是无缘无故会飞的嘛哈哈哈哈哈哈哈锤哥真是技术人才啊!#雷神 #复联”这类调侃式短标题,第一波冲击力在于它把两个宇宙的角色塞进同一个吐槽箱里,但细想一下就能发现,它真正碰到的根本不是…

2026/9/6 0:06:59

超人VS蜘蛛侠:拆解超级IP的影响力与传播方法论

把“蜘蛛侠 vs 超人”放在 CSDN 上聊,可能很多人第一反应是走错片场了。但如果把这两个角色看成“两个持续运营了 80 多年的文化产品”,你会发现,这场比较本质上是两个不同 IP 策略的长期结果对比:超人赢在定义了整个超级英雄题材…

2026/9/6 0:06:59

基于CNN的调制信号识别:MATLAB实现时频图分类实战

简介:本资源是一套面向通信工程与信号处理方向学习者、研究者的深度学习实践方案,聚焦调制信号自动检测与识别这一典型无线通信任务,解决传统方法依赖人工特征、低信噪比下性能下降等痛点。压缩包共12个文件(10.73MB)&…

2026/9/6 0:06:59

超人会飞不算本事:系统稳定依赖清晰规则与边界设计

开头先不绕弯子。“#斯坦李吐槽dc 所以超人是无缘无故会飞的嘛哈哈哈哈哈哈哈锤哥真是技术人才啊!#雷神 #复联”这类调侃式短标题,第一波冲击力在于它把两个宇宙的角色塞进同一个吐槽箱里,但细想一下就能发现,它真正碰到的根本不是…

2026/9/6 0:06:59

超人VS蜘蛛侠:拆解超级IP的影响力与传播方法论

把“蜘蛛侠 vs 超人”放在 CSDN 上聊,可能很多人第一反应是走错片场了。但如果把这两个角色看成“两个持续运营了 80 多年的文化产品”,你会发现,这场比较本质上是两个不同 IP 策略的长期结果对比:超人赢在定义了整个超级英雄题材…

2026/9/6 0:06:59

基于CNN的调制信号识别:MATLAB实现时频图分类实战

简介:本资源是一套面向通信工程与信号处理方向学习者、研究者的深度学习实践方案,聚焦调制信号自动检测与识别这一典型无线通信任务,解决传统方法依赖人工特征、低信噪比下性能下降等痛点。压缩包共12个文件(10.73MB)&…

2026/9/6 11:40:10

USB Type-C PCB布局分区设计:电源、高速信号与PD协议全攻略

做硬件这行,Type-C接口算是典型的“看着简单,做起来全坑”的东西。光引脚就24个,高低速信号、电源、控制线全部塞在一个小小的连接器里,如果PCB布局不做规划,打样回来基本就是“插上没反应”、“高速掉线”、“静电一打…

2026/9/5 2:30:42

系统编程学习原型如何补齐稳定性边界

系统编程学习原型如何补齐稳定性边界预算有限时&#xff0c;我先优化明显多余的复制&#xff0c;而不是猜测性地换容器。用借用传递只读数据通常就能减少分配&#xff1a; fn parse(line: &str) -> Result<Item, Error> { /* ... */ }用基准确认热点确实在分配&am…

2026/9/6 10:19:40

雨花区哪家财务公司代理记账比较好?

在雨花区&#xff0c;企业处理财税事务常常面临诸多挑战&#xff0c;选择一家靠谱的财务公司至关重要。湖南巨勤财务管理咨询有限公司就是本地正规实体财税服务机构&#xff0c;深耕本地工商财税行业多年&#xff0c;熟悉当地工商局、税务局最新政策与申报流程。主营公司注册、…