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

相关新闻

嵌入式DMA开发实战:EDMA3中断、队列与优先级机制深度解析

嵌入式DMA开发实战:EDMA3中断、队列与优先级机制深度解析

1. 项目概述与核心价值 在嵌入式系统,尤其是高性能处理器(如TI的C6000系列DSP)的开发中,数据搬移的效率直接决定了整个系统的性能天花板。当你在处理音频流、视频帧或者雷达回波数据时,如果让CPU亲自去搬运每一个字节&…

2026/10/17 15:59:42 阅读更多 →
EDMA3高级DMA技术:Ping-Pong缓冲与传输链原理及McBSP音频实战

EDMA3高级DMA技术:Ping-Pong缓冲与传输链原理及McBSP音频实战

1. 项目概述与核心价值 在嵌入式系统开发,尤其是涉及高速数据流处理的应用中,CPU的资源是极其宝贵的。无论是音频编解码、图像传感器数据采集,还是高速通信接口的数据搬移,如果让CPU亲自去处理每一个字节的传输,其计算…

2026/10/18 5:48:45 阅读更多 →
图论:BFS与DFS,拓扑排序,前缀树Trie

图论:BFS与DFS,拓扑排序,前缀树Trie

深度优先搜索depth-first search,dfs 1、定义 这是一种用于遍历或搜索树/图的算法。简单来说,从起始节点开始,沿着路径尽可能深/远地搜索,直到到达叶子节点,然后回溯到上一个节点,继续探索未访问的路径。 2、方法 …

2026/10/18 5:48:49 阅读更多 →

最新新闻

智能家居Agent落地实践:OpenClaw技能编排与避坑指南

智能家居Agent落地实践:OpenClaw技能编排与避坑指南

1. 从一场产业园沙龙说起:智能家居Agent到底在解决什么问题前阵子参加了一场在智能家居产业园举办的社区沙龙,主题围绕智能体(Agent)在家庭场景里的落地展开。现场来了做硬件的、做云平台的、做语音交互的,还有几位专门…

2026/10/20 9:17:26 阅读更多 →
Python文件操作避坑指南:从open()到csv读写与编码实战

Python文件操作避坑指南:从open()到csv读写与编码实战

最近帮一位刚入门Python的朋友调脚本,他照着网上的教程写文件读写,结果光一个“中文乱码”就折腾了一晚上,紧接着又踩了“文件不存在”和“路径找不到”的连环坑。这事让我觉得,文件读写虽然看起来是Python最基础的一课&#xff0…

2026/10/20 9:17:26 阅读更多 →
大一微积分核心知识梳理:极限、导数与积分的高效复习指南

大一微积分核心知识梳理:极限、导数与积分的高效复习指南

简介:面向大一学生的微积分基本知识点整理资料,以可编辑的Word电子文档形式呈现,覆盖函数、极限与无穷小量、连续性、导数与不定积分等核心模块。资料从函数定义域和对应法则讲起,结合数形结合方法分析单调性、周期性、奇偶性&…

2026/10/20 9:17:26 阅读更多 →
难题揭榜退稿复盘:从概念拼盘到可验证技术方案的五个教训

难题揭榜退稿复盘:从概念拼盘到可验证技术方案的五个教训

我最近跟一个"难题揭榜"活动较上劲了。茶思屋难题揭榜第3期如期开榜,一共放出5道核心题,聚焦在智能计算与工程交叉方向上。我花了两周时间把每道题都拆了一遍,整理了一份接近长文的解题思路,顺手投了过去。结果两天后收…

2026/10/20 9:17:26 阅读更多 →
JavaScript AST反混淆实战:破解默认难度混淆的核心方法

JavaScript AST反混淆实战:破解默认难度混淆的核心方法

1. 为什么“默认难度”的AST反混淆反而最考验基本功“AST反混淆实战-默认难度”——这个标题乍看平平无奇,甚至有点刻意低调。没有“零基础速成”“一键破解”这类流量词,也没有“高阶进阶”“逆向天花板”之类的情绪拉满的修饰。但恰恰是这个“默认难度…

2026/10/20 9:17:26 阅读更多 →
AI生成架构图与流程图:10分钟完成传统1天工作

AI生成架构图与流程图:10分钟完成传统1天工作

1. 为什么架构图和流程图成了“时间黑洞”?——从真实协作场景说起我带过不下二十个跨职能项目,每次开需求评审会,总有人提前半小时到会议室,默默打开Visio或draw.io,手指在键盘上敲得飞快,嘴里还念叨着“这…

2026/10/20 9:16:21 阅读更多 →

日新闻

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →
ESP32舵机控制指南:原理、多路驱动与避坑实战

ESP32舵机控制指南:原理、多路驱动与避坑实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →
位移法实现一阶低通滤波:单片机ADC采样降噪实战

位移法实现一阶低通滤波:单片机ADC采样降噪实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/19 10:02:04 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/19 17:32:41 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/20 2:50:50 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/19 2:54:50 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/19 9:10:22 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/18 12:16:16 阅读更多 →