复习:RabbitMQ 消息可靠性
RabbitMQ 消息可靠性1、RabbitMQ 消息丢失的可能性消息从生产者到消费者经过三个环节生产者、MQ、消费者任一个环节都有可能丢失消息。1.1 生产者消息丢失场景生产者发送消息时连接 MQ 失败消息到达 MQ 后未找到 Exchange消息到达 MQ 的 Exchange 后未找到合适的 Queue消息到达 MQ 后处理消息的进程发生异常1.2 MQ 导致消息丢失消息到达 MQ保存到队列后尚未消费就突然宕机1.3 消费者丢失消息接收后尚未处理突然宕机消息接收后处理过程中抛出异常综上要保证 MQ 的可靠性必须从 3 个方面入手确保生产者一定把消息发送到 MQ确保 MQ 不会将消息弄丢确保消费者一定要处理消息2、如何保证生产者消息的可靠性2.1 生产者重试机制生产者发送消息时出现网络故障导致与 MQ 连接中断。SpringAMQP 提供了消息发送时的重试机制当RabbitTemplate与 MQ 连接超时后多次重试。在生产者对应的 yml 中配置spring:rabbitmq:connection-timeout:1s# 设置MQ的连接超时时间template:retry:enabled:true# 开启超时重试机制initial-interval:1000ms# 失败后的初始等待时间multiplier:2# 失败后下次的等待时长倍数下次等待时长 initial-interval * multipliermax-attempts:3# 最大重试次数故意写错 URL 测试可发现总共重试了 3 次注意SpringAMQP 提供的重试机制是阻塞式的重试等待过程中当前线程被阻塞。如果对业务性能有要求建议禁用重试机制。2.2 生产者确认机制一般生产者与 MQ 网络连接比较稳定基本不用考虑第一种场景。但到达 MQ 之后可能丢失的场景包括消息到达 MQ 没有找到 Exchange消息到达 MQ 找到 Exchange但没有找到 QueueMQ 内部处理消息进程异常RabbitMQ 提供生产者消息确认机制包括Publisher Confirm和Publisher Return两种。开启确认机制后生产者发消息给 MQMQ 根据处理情况返回不同回执消息发送到 MQ 但路由失败通过 Publisher Return 返回信息同时返回 ack 表示投递成功非持久化消息发送到 MQ 且入队成功返回 ack 表示投递成功持久化消息发送到 MQ入队成功并持久化到磁盘返回 ack 表示投递成功其他情况返回 nack告知投递失败其中ack和nack属于 Publisher Confirmack成功nack失败return属于 Publisher Return。默认两者都关闭需配置开启。2.3 实现生产者确认2.3.1 配置 yml 开启生产者确认spring:rabbitmq:publisher-confirm-type:correlated# 开启publisher confirm机制并设置confirm类型publisher-returns:true# 开启publisher return机制publisher-confirm-type三种模式none关闭 confirm 机制simple同步阻塞等待 MQ 的回执correlatedMQ 异步回调返回回执一般使用此模式2.3.2 定义 ReturnCallback每个RabbitTemplate只能配置一个 ReturnCallback可定义配置类统一配置packagecom.chenwen.producer.config;importlombok.AllArgsConstructor;importlombok.extern.slf4j.Slf4j;importorg.springframework.amqp.core.ReturnedMessage;importorg.springframework.amqp.rabbit.core.RabbitTemplate;importorg.springframework.context.annotation.Configuration;importjavax.annotation.PostConstruct;Slf4jAllArgsConstructorConfigurationpublicclassReturnsCallbackConfig{privatefinalRabbitTemplaterabbitTemplate;PostConstructpublicvoidinit(){rabbitTemplate.setReturnsCallback(returned-{log.error(触发return callback,);log.debug(交换机exchange: {},returned.getExchange());log.debug(路由键routingKey: {},returned.getRoutingKey());log.debug(message: {},returned.getMessage());log.debug(replyCode: {},returned.getReplyCode());log.debug(replyText: {},returned.getReplyText());});}}2.3.3 定义 ConfirmCallback每个消息处理逻辑不同需单独定义 ConfirmCallback。调用RabbitTemplate.convertAndSend时多传一个CorrelationData参数。CorrelationData包含两个核心内容id消息唯一标识MQ 对不同的消息回执以此判断避免混淆SettableListenableFuture回执结果的 Future 对象调用convertAndSend时传入CorrelationDataMQ 的回执通过 Future 返回可提前给 Future 添加回调TestvoidtestProducerConfirmCallback()throwsInterruptedException{// 创建CorrelationDataCorrelationDatacdnewCorrelationData(UUID.randomUUID().toString());cd.getFuture().addCallback(newListenableFutureCallbackCorrelationData.Confirm(){OverridepublicvoidonFailure(Throwableex){log.error(消息回调失败,ex);}OverridepublicvoidonSuccess(CorrelationData.Confirmresult){log.info(收到confirm callback回执);if(result.isAck()){log.info(消息发送成功收到ack);}else{// 消息发送失败log.error(消息发送失败收到nack 原因{},result.getReason());}}});rabbitTemplate.convertAndSend(test.direct,chenwen,hello,cd);}测试说明路由键写错chenwen1路由失败通过 Publisher Return 返回异常信息并返回 ACK路由键正确chenwen不会返回 Publisher Return 信息只返回 ACK注意开启生产者确认模式较消耗 MQ 性能一般不建议开启。分析三种场景路由失败人为编程错误交换机名称错误编程错误MQ 内部故障需要处理但概率较低仅对消息可靠性要求极高的场景才开启一般只需开启 Publisher Confirm 处理 nack 即可3、MQ 消息可靠性MQ 可靠性指消息到达 MQ 还没被消费时MQ 因重启导致消息丢失。主要包括交换机 Exchange 持久化队列 Queue 持久化消息本身的持久化3.1 Exchange 交换机持久化Durability 参数设置持久化Durable持久化模式Transient临时模式。3.2 Queues 队列持久化队列持久化在控制台 Queues 设置 DurabilityDurable持久化模式Transient临时模式。3.3 消息的持久化Delivery mode 参数设为 2 即持久化。注意若开启消息持久化且开启生产者确认模式需等消息持久化到磁盘才发送 ACK 回执。为减少 IO消息并非逐条持久化而是每隔一段时间约 100ms批量持久化导致 ACK 有延迟建议生产者确认全部采用异步方式。3.4 LazyQueue惰性队列默认情况下生产者发消息存于内存以提高效率但某些情况会消息堆积消费者宕机或网络故障生产者生产过快超过消费者处理能力消费者处理业务发生堵塞消息堆积导致内存占用变大触发内存预警时RabbitMQ 将内存消息持久化到磁盘PageOut。PageOut 耗时会阻塞队列进程MQ 不再处理新消息生产者请求被阻塞。RabbitMQ 从 3.6.0 版本起增加 Lazy Queues惰性队列特性接收消息后直接存磁盘而非内存消费者消费时才从磁盘读取并加载到内存懒加载支持数百万条消息存储3.12 版本之后LazyQueue 已成为所有队列的默认格式。官方推荐升级 MQ 到 3.12 或所有队列设为 LazyQueue。4、消费者的可靠性RabbitMQ 向消费者投递消息时可能因素导致丢失投递过程网络故障消费者接收后突然宕机消费者已接收但处理报错导致异常RabbitMQ 需知道消费者处理状态失败可再次投递。4.1 消费者确认机制消费者处理消息后向 RabbitMQ 发送回执告知状态主要有三个ack处理成功RabbitMQ 从队列删除消息nack处理失败RabbitMQ 重新投递reject处理失败并拒绝RabbitMQ 从队列删除可用 try-catch 成功返回 ack 失败返回 nack但 SpringAMQP 已实现配置acknowledge-mode即可none不处理投递即 ack消息立即删除不建议manual手动模式业务代码中调用 API 发送 ack/reject有业务入侵但灵活auto自动模式SpringAMQP 用 AOP 环绕增强正常返回 ack失败按异常返回 nack 或 reject业务异常自动返回 nack消息处理或校验异常自动返回 rejectspring:rabbitmq:listener:simple:acknowledge-mode:none# 不做处理4.1.1 测试 acknowledge-mode: none 不做处理向test.queue发一条消息队列当前有一条消息消费者监听并抛MessageConversionException。debug 断点未抛异常前刷新控制台消息已不存在被立即 ack 删除4.1.2 测试 acknowledge-mode: auto 自动处理4.1.2.1 消费者抛出消息异常抛MessageConversionException异常点打断点UI 后台消息状态为Unacked执行完消息数量为 0说明消息异常直接被 reject4.1.2.2 消费者抛出业务异常抛RuntimeException断点前消息为Unacked异常抛出后消息回到Ready状态确保业务异常后消息可再次投递5、消费者失败重试机制5.1 消费者失败重试机制消费者异常后消息不断 requeue 到队列重新投递若一直失败会无限循环导致 MQ 消息处理飙升。Spring 提供消费者重试机制本地重试而非无限 requeue。消费者 application.yml 配置spring:rabbitmq:listener:simple:retry:enabled:true# 开启消费者失败重试initial-interval:1000ms# 初始失败等待时长1秒multiplier:1# 失败等待时长倍数下次等待时长 multiplier * last-intervalmax-attempts:3# 最大重试次数stateless:true# true无状态false有状态。业务含事务时改为false效果消息失败后在本地重试 3 次不再重新入队本地重试 3 次后抛出AmqpRejectAndDontRequeueException消息被删除回执为 reject5.2 失败处理策略失败重试 3 次后消息被删除对可靠性要求高的场景不符合。Spring 提供失败处理策略由MessageRecovery接口定义三种实现RejectAndDontRequeueRecoverer重试耗尽返回 reject直接丢弃默认ImmediateRequeueMessageRecoverer重试耗尽返回 nack消息重新入队RepublishMessageRecoverer重试耗尽将失败消息投递到指定交换机最佳策略为RepublishMessageRecoverer重试耗尽后投递到指定交换机后续人工处理。示例配置packagecom.chenwen.consumer.config;importlombok.extern.slf4j.Slf4j;importorg.springframework.amqp.core.Binding;importorg.springframework.amqp.core.BindingBuilder;importorg.springframework.amqp.core.DirectExchange;importorg.springframework.amqp.core.Queue;importorg.springframework.amqp.rabbit.core.RabbitTemplate;importorg.springframework.amqp.rabbit.retry.MessageRecoverer;importorg.springframework.amqp.rabbit.retry.RepublishMessageRecoverer;importorg.springframework.boot.autoconfigure.condition.ConditionalOnProperty;importorg.springframework.context.annotation.Bean;importorg.springframework.context.annotation.Configuration;Slf4jConfigurationConditionalOnProperty(namespring.rabbitmq.listener.simple.retry.enabled,havingValuetrue)publicclassErrorConfiguration{BeanpublicDirectExchangeerrorExchange(){returnnewDirectExchange(error.direct);}BeanpublicQueueerrorQueue(){returnnewQueue(error.queue);}BeanpublicBindingerrorBinding(QueueerrorQueue,DirectExchangeerrorExchange){returnBindingBuilder.bind(errorQueue).to(errorExchange).with(error);}BeanpublicMessageRecoverermessageRecoverer(RabbitTemplaterabbitTemplate){log.debug(加载RepublishMessageRecoverer);returnnewRepublishMessageRecoverer(rabbitTemplate,error.direct,error);}}重试 3 次耗尽后消息放入error.queue队列重试次数耗尽后MQ 信息放在error.queue队列中此时error.queue多了一条数据后续人为处理或单独监听处理。

相关新闻

PLC ST语言程序入门教程

PLC ST语言程序入门教程

在 PLC-IOT 的落地项目实践中,有很多: “PLC做设备端的信息采集和控制,web 做数据的展示和系统人机接口 ” 的项目。使用 TRAE IDE,web 方面的工作基本都让 AI 做了,我们有尝试让AI 写 PLC 的程序,发现 AI …

2026/8/6 7:26:25 阅读更多 →
Android自动化广告跳过工具GKD:原理、配置与规则深度解析

Android自动化广告跳过工具GKD:原理、配置与规则深度解析

1. 项目概述:当“跳过广告”成为一种刚需不知道你有没有过这样的体验:打开一个常用的App,开屏广告强制让你等上5秒,手指悬在“跳过”按钮上,生怕点错;看个短视频,每隔几分钟就插播一段无法跳过的…

2026/8/6 7:26:25 阅读更多 →
MVC演化

MVC演化

MVC演化:从桌面到前端,一场架构思想的进化史 从“三位一体”到“职能分离”MVC(Model-View-Controller)模式诞生于1979年,最初为Smalltalk-80桌面应用设计。它的核心思想是关注点分离:Model负责业务数据和规…

2026/8/6 7:26:25 阅读更多 →

最新新闻

Unity机器人仿真:从URDF导入到键盘控制关节运动的完整指南

Unity机器人仿真:从URDF导入到键盘控制关节运动的完整指南

1. 项目概述与核心价值 最近在做一个机器人仿真项目,需要把SolidWorks里设计好的机械臂模型弄到Unity里,并且能通过键盘实时控制它的关节运动。听起来是个挺常见的需求,对吧?但实际操作起来,从URDF文件导入到最终实现流…

2026/8/6 10:24:01 阅读更多 →
电气平衡与模态分析:机电系统振动噪声诊断与优化

电气平衡与模态分析:机电系统振动噪声诊断与优化

1. 项目概述:从“平衡”到“模态”的工程洞察 在电气工程、机械振动乃至声学设计领域,有两个听起来专业、用起来却无处不在的核心概念:“电气平衡”与“模态分析”。乍一看,它们似乎分属不同学科——一个关乎电路系统的稳定与效率…

2026/8/6 10:24:01 阅读更多 →
Ping进程阻塞问题分析与信号处理机制详解

Ping进程阻塞问题分析与信号处理机制详解

1. 问题现象解析:为什么ping进程会发出1包后阻塞?当我们在终端执行ping命令时,预期行为是持续发送ICMP回显请求包并接收响应。但某些情况下,进程会在发送第一个包后突然停止响应,这种现象通常与信号处理和进程状态管理…

2026/8/6 10:24:01 阅读更多 →
魔兽争霸3终极优化指南:5分钟解决分辨率与帧率兼容性问题

魔兽争霸3终极优化指南:5分钟解决分辨率与帧率兼容性问题

魔兽争霸3终极优化指南:5分钟解决分辨率与帧率兼容性问题 【免费下载链接】WarcraftHelper Warcraft III Helper , support 1.20e, 1.24e, 1.26a, 1.27a, 1.27b 项目地址: https://gitcode.com/gh_mirrors/wa/WarcraftHelper 还在为魔兽争霸3在现代电脑上模糊…

2026/8/6 10:24:01 阅读更多 →
深入解析JVM垃圾回收算法原理与实践

深入解析JVM垃圾回收算法原理与实践

1. 垃圾回收算法概述作为一名在Java虚拟机领域工作多年的开发者,我经常需要深入理解各种垃圾回收(GC)算法的实现原理和适用场景。垃圾回收是现代编程语言内存管理的核心技术,它自动回收不再使用的内存空间,避免了手动内存管理带来的内存泄漏和…

2026/8/6 10:24:00 阅读更多 →
Linux内核参数调优实战指南

Linux内核参数调优实战指南

1. 为什么需要Linux内核参数调优 我第一次接触Linux内核参数调优是在一个电商大促前的压测场景。当时我们的服务器在3000并发时就出现了大量TCP连接超时,而硬件配置明明绰绰有余。经过三天三夜的排查,最终发现是默认的 net.ipv4.tcp_max_syn_backlog 值…

2026/8/6 10:23:00 阅读更多 →

日新闻

深入解析LimboAI C++内核:架构设计与性能优化实战

深入解析LimboAI C++内核:架构设计与性能优化实战

1. 项目概述:为什么我们需要深入LimboAI的C内核?如果你是一名使用Godot引擎的游戏开发者,尤其是对AI行为逻辑有较高要求的项目,那么LimboAI这个名字你大概率不会陌生。它作为Godot 4生态中一个备受瞩目的行为树与状态机插件&#…

2026/8/6 0:00:06 阅读更多 →
Unity 2D游戏敌人AI系统:基于PlayMaker状态机与2D Toolkit的实战开发

Unity 2D游戏敌人AI系统:基于PlayMaker状态机与2D Toolkit的实战开发

1. 项目概述与核心思路大家好,我是老张,一个在游戏开发一线摸爬滚打了十多年的老码农。今天咱们接着聊《空洞骑士》风格2D动作游戏的Demo制作。上一期我们搭好了基础框架,处理了角色移动和碰撞,这一期,我们要让游戏世界…

2026/8/6 0:00:06 阅读更多 →
被动防火门市场前景发展趋势

被动防火门市场前景发展趋势

被动防火门依靠材质结构、密闭构造阻隔烟火蔓延,无需电控启动,是建筑被动消防系统核心构件,行业依托新规管控、城市更新、工业安全升级迎来稳定扩容,整体朝着合规化、专项化、低碳化、智能化方向发展。现阶段 GB12955‑2024 新版国…

2026/8/6 0:00:06 阅读更多 →

周新闻

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

1. 从水管网络到最大流:一个核心问题的诞生想象一下,你是一个城市供水系统的总工程师。你的城市有多个水源(水库),需要通过一个复杂的地下管道网络,将水输送到各个居民区。每条管道都有其最大通水能力&…

2026/8/5 15:00:43 阅读更多 →
基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台…

2026/8/5 13:13:56 阅读更多 →
MATLAB xcorr函数详解:从互相关原理到四大实战应用

MATLAB xcorr函数详解:从互相关原理到四大实战应用

1. 从一次信号“找茬”说起:为什么我们需要互相关几年前,我在处理一组声学传感器数据时遇到了一个棘手的问题。我有两个麦克风记录了一段相同的音频信号,理论上它们接收到的声音波形应该非常相似,只是由于麦克风位置不同&#xff…

2026/8/5 10:20:36 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/5 23:28:39 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/5 21:00:14 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/5 23:46:51 阅读更多 →