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去重或数据库唯一索引来处理重复消息。

相关新闻

AI 数字员工 OpenClaw 实操分享 本地运行保障文件数据隐私安全(含安装包)

AI 数字员工 OpenClaw 实操分享 本地运行保障文件数据隐私安全(含安装包)

🦞OpenClaw(小龙虾)Windows 一键部署保姆级教程|10 分钟搭建专属数字员工 适配平台:Windows 10/11(64 位)|零基础友好|全图形界面操作|无开发门槛 &#x1…

2026/7/22 16:04:49阅读更多 →
RabbitMQ Exporter高级功能:BERT编码与no_sort特性提升监控效率

RabbitMQ Exporter高级功能:BERT编码与no_sort特性提升监控效率

RabbitMQ Exporter高级功能:BERT编码与no_sort特性提升监控效率 【免费下载链接】rabbitmq_exporter Prometheus exporter for RabbitMQ 项目地址: https://gitcode.com/gh_mirrors/ra/rabbitmq_exporter RabbitMQ Exporter是一款针对RabbitMQ的Prometheus监…

2026/7/22 16:02:48阅读更多 →
spring事务管理以及事务的四大特性

spring事务管理以及事务的四大特性

一般放置在多次操作数据库上。

2026/7/22 16:02:48阅读更多 →
Vibe Coding 实战:不会写代码,3 步让 AI 帮你把网页做出来(附完整提示词)

Vibe Coding 实战:不会写代码,3 步让 AI 帮你把网页做出来(附完整提示词)

一、为什么 Vibe Coding 突然火了? 2024 年底,OpenAI 前科学家 Andrej Karpathy 发了一条推文,把 Vibe Coding 这个词带出了圈。它的核心意思很简单:你不再逐行写代码,而是描述"想要什么",让 AI …

2026/7/22 17:00:58阅读更多 →
DocMind-python-agent-V2:Langgraph与状态机

DocMind-python-agent-V2:Langgraph与状态机

通过上节课我们可以看到,在没有告诉大模型数据库结构的情况下,大模型会请求三次调用执行sql的tool来抓表、抓表结构、抓数据,而且是我们通过对话大模型告诉我的,本节课我们实操一下Langgraph与状态机,在项目中来监控。…

2026/7/22 17:00:58阅读更多 →
TMS320F2837xS Flash配置优化:从等待状态到ECC的嵌入式系统性能提升指南

TMS320F2837xS Flash配置优化:从等待状态到ECC的嵌入式系统性能提升指南

1. 项目概述与核心挑战 在基于TMS320F2837xS这类高性能实时微控制器的嵌入式系统开发中,Flash存储器的配置与优化常常是决定系统整体性能与可靠性的关键一环,却也是最容易被忽视或配置不当的环节。很多工程师在项目初期,往往将注意力集中在算…

2026/7/22 17:00:58阅读更多 →
DM646x启动机制深度解析:从ROM Bootloader到多模式引导实战

DM646x启动机制深度解析:从ROM Bootloader到多模式引导实战

1. 项目概述:深入理解DM646x的启动基石在嵌入式系统开发中,系统上电后的第一行代码决定了整个设备的命运。对于基于德州仪器(TI)TMS320DM646x这类高度集成的数字媒体片上系统(DMSoC)而言,其内置…

2026/7/22 17:00:58阅读更多 →
嵌入式USB接收端点寄存器深度解析:从RXMAXP到RXCSR的配置与调试

嵌入式USB接收端点寄存器深度解析:从RXMAXP到RXCSR的配置与调试

1. 项目概述与核心价值搞嵌入式USB开发,尤其是基于TI这类厂商的专用控制器,最让人头疼的往往不是协议栈本身,而是那一堆密密麻麻的寄存器手册。手册里每个位域都写得清清楚楚,但真到了写驱动、调通信的时候,怎么把这些…

2026/7/22 16:58:58阅读更多 →
嵌入式开发实战:USB端点与看门狗寄存器配置避坑指南

嵌入式开发实战:USB端点与看门狗寄存器配置避坑指南

1. 项目概述与核心价值在嵌入式系统开发里,和硬件打交道是绕不开的基本功。CPU要指挥USB收发数据,或者让看门狗定时器在关键时刻“踢”系统一脚,靠的都是直接读写那一组组看似冰冷的寄存器。很多新手觉得寄存器配置就是对着手册填地址和数值&…

2026/7/22 16:58:58阅读更多 →
Go语言静态资源打包方案对比与实践指南

Go语言静态资源打包方案对比与实践指南

1. 项目背景与核心需求在Go语言开发中,我们经常需要处理静态资源文件的打包问题。无论是Web应用的模板文件、前端资源,还是配置文件、证书等,都需要随程序一起分发。传统做法是将这些文件与编译后的二进制文件放在同一目录下,但这…

2026/7/22 0:53:59阅读更多 →
Go语言实现高性能LDAP认证服务的架构与实践

Go语言实现高性能LDAP认证服务的架构与实践

1. 项目背景与核心价值LDAP(轻量级目录访问协议)作为企业级身份认证的黄金标准,已经服务了超过80%的财富500强公司。我在金融科技领域实施统一认证体系时,发现传统Java方案存在启动慢、内存占用高等痛点。而Go语言凭借其协程并发模…

2026/7/22 0:53:59阅读更多 →
【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

【AI面试官实战指南】:用ChatGPT模拟10类高频技术岗面试,3天提升应答精准度92%

更多请点击: https://intelliparadigm.com 第一章:AI面试官实战指南的核心价值与适用场景 AI面试官并非替代人类HR的“黑箱工具”,而是以可解释、可审计、可迭代的方式,赋能招聘全链路的关键基础设施。其核心价值在于将主观经验沉…

2026/7/22 0:53:59阅读更多 →
中小企业小程序开发公司怎么选:预算、上手和售后避坑指南

中小企业小程序开发公司怎么选:预算、上手和售后避坑指南

中小企业做小程序,最常见的矛盾是预算有限,但又不希望功能太单薄;没有技术团队,但又希望后续能自己运营;想快速上线,又担心隐性收费和售后失联。选型时如果只看“低价套餐”或“案例数量”,很容…

2026/7/22 0:01:17阅读更多 →
GEO优化如何沉淀长期内容资产?广拓时代谈AI搜索时代的内容ROI

GEO优化如何沉淀长期内容资产?广拓时代谈AI搜索时代的内容ROI

企业做营销,最怕钱花完了,资产没有留下。 效果广告能带来一段时间的曝光,但预算停止后,流量往往也随之停止。短视频内容可能在几天内冲高,也可能很快沉下去。AI搜索时代,企业需要重新思考一个问题&#xff…

2026/7/22 0:01:17阅读更多 →
Agent 终态判定:何时该停止思考、给出最终回复

Agent 终态判定:何时该停止思考、给出最终回复

Agent 终态判定:何时该停止思考、给出最终回复 一、你的 Agent 在"再想想"的循环里绕了 12 轮,用户已经关窗口了 Agent 与人最大的区别是:人知道什么时候该停下来给答案,Agent 会一直"想"下去。你给 Agent 接…

2026/7/22 0:01:17阅读更多 →
YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

YOLOv8推理性能优化:从1.2FPS到35FPS的全链路加速实践

如果你在部署 YOLOv8 时,发现推理速度只有可怜的 1-2 FPS,而别人的演示视频却能跑到 30 FPS 以上,那么问题很可能不在模型本身,而在于你的整个处理链路。很多开发者拿到一个训练好的 YOLOv8 模型后,会直接使用官方示例…

2026/7/21 22:53:50阅读更多 →
Coze与Dify对比指南:低代码AI应用开发从入门到实战

Coze与Dify对比指南:低代码AI应用开发从入门到实战

1. 从零到一:为什么你需要了解 Coze 和 Dify?如果你对 AI 应用开发感兴趣,但一看到“大模型”、“智能体”、“工作流”这些词就头疼,觉得门槛太高,那这篇文章就是为你准备的。很多开发者,包括我自己&#…

2026/7/21 18:53:30阅读更多 →
AI生图工具怎么选?2026年6月版实测对比

AI生图工具怎么选?2026年6月版实测对比

做自媒体的朋友应该都有体会:配图一直是个让人头疼的问题。2026年,AI生图工具已经非常成熟了,但工具太多反而不知道怎么选。以下是截至2026年6月我对主流AI生图工具的实测对比。Midjourney V8.1:速度之王2026年6月11日&#xff0c…

2026/7/21 18:53:30阅读更多 →