Rabbitmq 业务异常与未手动确认场景及解决方案
消费端消费异常,业务异常 与 未手动确认是不是一个场景,因为执行完业务逻辑,再确认。解决方案就一个,就是重试一定次数,然后加入死信队列。还有就是消费重新放入队列,然后重新投递给其他消费者,是什么场景
在 RabbitMQ 中,关于消息消费异常的场景确实有多个细分,下面我们可以具体讨论一下你提到的 消费端消费异常、业务异常与未手动确认 以及它们对应的解决方案。
1. 消费端消费异常、业务异常与未手动确认的关系
未手动确认 是一个常见的消费场景,与 消费端消费异常 和 业务异常 是相关但不同的概念。它们分别的定义和解决方案如下:
1.1 未手动确认(Acknowledge)
-
场景描述: 消费者在接收到消息后,没有及时确认消息(没有执行
ack()或reject())。如果没有确认,RabbitMQ 会认为消息未被处理,默认情况下它会在消费者断开连接或超时后重新投递消息。关键点:
- 消息消费过程中,如果消费者处理完消息后不发送
ack确认消息,RabbitMQ 不会删除队列中的消息,而是保留该消息并等待确认。 - 如果消费者崩溃或未及时确认消息,RabbitMQ 会重新将该消息投递给其他消费者,或者重复投递给相同消费者。
- 消息消费过程中,如果消费者处理完消息后不发送
-
解决方案:
- 使用手动确认机制(
manual ack),确保每条消息处理成功后都及时发送ack。如果处理失败,可以选择发送nack(negative acknowledgment)并将消息重新放回队列,或者将其放入死信队列。 - 消费者必须确保在处理完消息后调用
ack,如果在某些情况下处理失败,可以实现一定的重试机制或者将失败的消息放入死信队列进行后续人工干预。
- 使用手动确认机制(
1.2 消费端消费异常
-
场景描述: 消费者在处理消息时发生异常,例如业务逻辑抛出异常或无法访问外部系统(如数据库、API)等。这种情况下,消费者在处理消息时不能正常完成业务逻辑,可能会抛出异常或者无法成功完成操作。
关键点:
- 这种异常通常发生在消费消息后,进行业务处理时。如果业务处理失败,消费者可能会想要重新处理消息,或者放弃该消息。
-
解决方案:
- 重试机制:可以使用重试机制,重新消费该消息。常见的做法是使用指数退避策略(例如,逐渐增加重试间隔),避免过多的重试导致系统负载过高。
- 死信队列:在多次重试失败后,可以将消息放入死信队列(Dead Letter Queue),等待后续处理或人工干预。
- 幂等性设计:确保消费者在处理业务时,具备幂等性,即即使相同的消息被消费多次,系统的状态不会发生不一致。
1.3 业务异常
-
场景描述: 业务逻辑的错误通常会导致处理失败,例如数据不一致、外部依赖故障等。这类异常与消费端是否手动确认无关,重点在于业务处理本身是否成功。
-
解决方案:
- 重试机制:与消费端异常类似,业务异常通常也需要一个重试机制,特别是在外部服务不可用的情况下。
- 死信队列:如果在多次重试后仍无法解决,消息可以被移至死信队列,等待人工干预。
- 补偿机制:在某些业务场景中,可以采用补偿机制来恢复错误的操作。比如某个业务操作失败后,通过反向操作来抵消已经完成的部分。
2. 消息重新投递给其他消费者(与未手动确认)
这种场景通常发生在 未手动确认 或者 消费端崩溃 的情况下。
场景描述:
如果某个消费者无法确认消息(例如,未发送 ack 或者消费者崩溃),RabbitMQ 会尝试将该消息重新投递给其他消费者。RabbitMQ 会将消息返回到队列并将其重新投递给其他消费者进行处理。
-
关键点:
- 这种行为发生在消费者处理消息时发生未确认的情况,而不是因为业务逻辑失败。
- 其他消费者可以接收到重新投递的消息并重新进行消费。
-
解决方案:
- 消息确认机制:确保消费者在每次成功处理后确认消息。如果未确认,RabbitMQ 会重新投递消息。
- 消费者数量扩展:为了提高消费速度,可以增加消费者的数量来帮助分担消息的消费压力,减少消息堆积。
3. 消费异常的重试和死信队列
这是一个非常普遍的补偿机制,适用于大多数异常场景。
场景描述:
如果消息消费失败,重试一定次数后仍然无法成功处理,可以将消息投递到死信队列。
- 关键点:
- 重试:对于可恢复的异常(例如外部系统暂时不可用),可以设定一个重试机制,尝试重新处理消息。重试次数可以限定。
- 死信队列:对于不可恢复的异常,或者经过多次重试仍然失败的消息,将消息放入死信队列。死信队列可以由开发人员或运维人员查看,进行人工干预,或者进行后续处理(例如,通知系统管理员或通过补偿机制修正错误)。
解决方案:
- 设置最大重试次数:为了避免死循环和队列无限增长,可以设置最大重试次数,超过次数后将消息转移到死信队列。
- 死信队列配置:配置死信队列以便后续处理。例如,可以通过 DLX(死信交换机)配置将失败消息转移到指定的死信队列。
- 重试延迟:在消息重试过程中使用延迟队列,避免系统立即重新处理失败的消息,允许外部系统或条件恢复后再进行处理。
总结
- 未手动确认 是一个消费者未及时确认消息的场景,RabbitMQ 会重新投递消息。解决方案包括手动确认、重试机制和死信队列。
- 消费端消费异常 指的是消费者在处理消息时发生异常,通常需要实现重试机制或将失败的消息放入死信队列。
- 业务异常 通常与业务逻辑相关,需要针对具体的业务场景设计补偿机制(如重试、死信队列、补偿事务等)。
- 消息重新投递给其他消费者 是未手动确认或消费者崩溃的结果,RabbitMQ 会将未确认的消息重新投递给其他消费者进行处理。
总的来说,处理消费端异常的核心思路是通过重试机制、幂等性设计和死信队列等技术手段,确保消息消费的可靠性和系统的健壮性。
相关文章:
Rabbitmq 业务异常与未手动确认场景及解决方案
消费端消费异常,业务异常 与 未手动确认是不是一个场景,因为执行完业务逻辑,再确认。解决方案就一个,就是重试一定次数,然后加入死信队列。还有就是消费重新放入队列,然后重新投递给其他消费者,…...
linux,centos7.6安装禅道
1.cd /opt 2.wget https://www.zentao.net/dl/zentao/18.5/ZenTaoPMS.18.5.zbox_64.tar.gz 3.tar xvzf ZenTaoPMS.18.5.zbox_64.tar.gz 4./opt/zbox/zbox --aport 4005 --mport 3307 start 安全组开启一下两个端口 –aport 4005:设置Apache启动端口为4005 –mport 3…...
java基础之代理
代理模式(Proxy Pattern) 简介 是一种结构型设计模式,主要用于为某对象提供一个代理对象,以控制对该对象的访问。通过引入一个代理对象来控制对原对象的访问。代理对象在客户端和目标对象之间充当中介,负责将客户端的…...
计算机网络——期末复习(6)期末考试样例2(含答案)
一、单项选择题(每题1分,共10小题,共计10分) 1.因特网多播采用的管理协议是( )协议。 A.UDP B.BGP C.IGMP D.TCP 2.采用CIDR时,某计算机的IP地址是202.35.79.88/19,该计算机所处子网的地址是( )。 A.202.35.0.…...
JavaScript 获取DOM对象
html的标签被js获取到之后就变成了js对象,对象里面包含了标签的属性和方法 。同一时间获取多个对象则会翻译一个数组,数组元素是对象 获取方法 1. const a document.getElementById("id"),根据标签的id来获取。因为id是唯一的、…...
一文讲明白朴素贝叶斯算法及其计算公式(入门普及)
1、贝叶斯算法 贝叶斯定理由英国数学家托马斯贝叶斯 ( Thomas Bayes) 提出的,用来描述两个条件概率之间的关系。通常,事件A在事件B 发生的条件下与事件 B 在事件 A 发生的条件下,它们两者的概率并不相同,但是它们两者之间存在一定…...
实际开发中,常见pdf|word|excel等文件的预览和下载
实际开发中,常见pdf|word|excel等文件的预览和下载 背景相关类型数据之间的转换1、File转Blob2、File转ArrayBuffer3、Blob转ArrayBuffer4、Blob转File5、ArrayBuffer转Blob6、ArrayBuffer转File 根据Blob/File类型生成可预览的Base64地址基于Blob类型的各种文件的下载各种类型…...
Python自学 - 递归函数
1 Python自学 - 递归函数 递归函数是一种在函数体内调用自己的函数,就像“左脚踩着右脚,再右脚踩着左脚… 嗯,你就可以上天了!”。递归函数虽然不能上天,但在处理某些场景时非常好用, 一种典型的场景就是遍…...
Spark-Streaming有状态计算
一、上下文 《Spark-Streaming初识》中的NetworkWordCount示例只能统计每个微批下的单词的数量,那么如何才能统计从开始加载数据到当下的所有数量呢?下面我们就来通过官方例子学习下Spark-Streaming有状态计算。 二、官方例子 所属包:org.…...
Markdown如何导出Html文件Markdown文件
Markdown如何导出Html文件Markdown文件 前言语法详解小结其他文章快来试试吧☺️ Markdown 导出 HTML 👈点击这里也可查看 前言 Markdown的源文件以md为后缀。Markdown是HTML语法的简化版本,它本身不带有任何样式信息。我们所看到的Markdown网页(如&…...
使用Python进行图像裁剪和直方图分析
一、简介 在数字图像处理领域,裁剪和分析图像的直方图是两个非常基本且重要的操作。本文将通过一个简单的Python项目,展示如何使用skimage和matplotlib库来裁剪图像并分析其RGB通道的直方图。 二、环境准备 在开始之前,请确保你已经安装了以…...
企业内管信息化系统
本文结尾处获取源码。 本文结尾处获取源码。 本文结尾处获取源码。 一、相关技术 后端:Java、JavaWeb / Springboot。前端:Vue、HTML / CSS / Javascript 等。数据库:MySQL 二、相关软件(列出的软件其一均可运行) I…...
【python因果库实战15】因果生存分析4
这里写目录标题 加权标准化生存分析总结个体层面的生存曲线 加权标准化生存分析 我们还可以将加权与标准化结合起来,使用 WeightedStandardizedSurvival 模块。在这里,我们将逆倾向得分加权模型(根据基线协变量重新加权人群)与加…...
Linux 线程详解
目录 一、线程概述 二、线程创建 三、线程终止 四、线程回收 五、线程取消 六、线程分离 七、线程安全 一、线程概述 线程是进程内的一个执行单元,是进程内可调度的实体。一个进程可以包含多个线程,这些线程共享进程的资源,如内存空…...
云架构:考量与框架
云架构:考量与框架 引言 在当今的数字化环境中,云计算已成为现代商业运营的基石。一个设计良好的云架构框架为可扩展、安全和弹性的系统奠定了基础。本文将深入探讨云架构的核心要素,讨论重要的考量因素、设计指南,以及最佳实践…...
SD下载、安装、使用、卸载-Stable Diffusion整合包v4.10发布!
目录 前言概述 SD安装1、安装软件2、启动3、配置4、运行5、测试 导入SD模型【决定画风】常用模型下载安装模型 SD卸载SD文生图提示词提示词使用技巧提示词的高级使用技巧强调关键词 前言 我向来不喜欢搞一些没有用的概念,所以直接整理可能用到的东西。 sd简单的说…...
java 发送邮件
前期准备 pom文件中引入 JavaMail API 和 JavaBean Activation FrameWork,得到两个jar包:mail.jar 和 activation.jar 发送简单邮件(只有邮件正文,普通文本) package com.zbttest.email;import com.sun.mail.util.Ma…...
聚类系列 (二)——HDBSCAN算法详解
在进行组会汇报的时候,为了引出本研究动机(论文尚未发表,暂不介绍),需要对DBSCAN、OPTICS、和HDBSCAN算法等进行详细介绍。在查询相关资料的时候,发现网络上对于DBSCAN算法的介绍非常多与细致,但…...
AngularJS HTML DOM
关于《AngularJS HTML DOM》的文章,我找到了一些有用的信息。这篇文章主要介绍了AngularJS如何通过特定的指令与HTML DOM元素进行交互。以下是一些关键点: ng-disabled 指令:这个指令用于将应用程序数据绑定到HTML的disabled属性。例如&#…...
C语言延时实现
C语言延时实现 在C语言中,delay 函数通过空循环实现延时,而不是像其他高级语言(如Python)直接使用 sleep 函数。这种实现方式是基于单片机的特性和C语言的底层操作。下面详细解释为什么这种空循环可以实现延时,以及它…...
【单片机期末】单片机系统设计
主要内容:系统状态机,系统时基,系统需求分析,系统构建,系统状态流图 一、题目要求 二、绘制系统状态流图 题目:根据上述描述绘制系统状态流图,注明状态转移条件及方向。 三、利用定时器产生时…...
图表类系列各种样式PPT模版分享
图标图表系列PPT模版,柱状图PPT模版,线状图PPT模版,折线图PPT模版,饼状图PPT模版,雷达图PPT模版,树状图PPT模版 图表类系列各种样式PPT模版分享:图表系列PPT模板https://pan.quark.cn/s/20d40aa…...
2025季度云服务器排行榜
在全球云服务器市场,各厂商的排名和地位并非一成不变,而是由其独特的优势、战略布局和市场适应性共同决定的。以下是根据2025年市场趋势,对主要云服务器厂商在排行榜中占据重要位置的原因和优势进行深度分析: 一、全球“三巨头”…...
免费PDF转图片工具
免费PDF转图片工具 一款简单易用的PDF转图片工具,可以将PDF文件快速转换为高质量PNG图片。无需安装复杂的软件,也不需要在线上传文件,保护您的隐私。 工具截图 主要特点 🚀 快速转换:本地转换,无需等待上…...
深度学习水论文:mamba+图像增强
🧀当前视觉领域对高效长序列建模需求激增,对Mamba图像增强这方向的研究自然也逐渐火热。原因在于其高效长程建模,以及动态计算优势,在图像质量提升和细节恢复方面有难以替代的作用。 🧀因此短时间内,就有不…...
逻辑回归暴力训练预测金融欺诈
简述 「使用逻辑回归暴力预测金融欺诈,并不断增加特征维度持续测试」的做法,体现了一种逐步建模与迭代验证的实验思路,在金融欺诈检测中非常有价值,本文作为一篇回顾性记录了早年间公司给某行做反欺诈预测用到的技术和思路。百度…...
水泥厂自动化升级利器:Devicenet转Modbus rtu协议转换网关
在水泥厂的生产流程中,工业自动化网关起着至关重要的作用,尤其是JH-DVN-RTU疆鸿智能Devicenet转Modbus rtu协议转换网关,为水泥厂实现高效生产与精准控制提供了有力支持。 水泥厂设备众多,其中不少设备采用Devicenet协议。Devicen…...
6个月Python学习计划 Day 16 - 面向对象编程(OOP)基础
第三周 Day 3 🎯 今日目标 理解类(class)和对象(object)的关系学会定义类的属性、方法和构造函数(init)掌握对象的创建与使用初识封装、继承和多态的基本概念(预告) &a…...
es6+和css3新增的特性有哪些
一:ECMAScript 新特性(ES6) ES6 (2015) - 革命性更新 1,记住的方法,从一个方法里面用到了哪些技术 1,let /const块级作用域声明2,**默认参数**:函数参数可以设置默认值。3&#x…...
门静脉高压——表现
一、门静脉高压表现 00:01 1. 门静脉构成 00:13 组成结构:由肠系膜上静脉和脾静脉汇合构成,是肝脏血液供应的主要来源。淤血后果:门静脉淤血会同时导致脾静脉和肠系膜上静脉淤血,引发后续系列症状。 2. 脾大和脾功能亢进 00:46 …...
