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语言的底层操作。下面详细解释为什么这种空循环可以实现延时,以及它…...
关于iview组件中使用 table , 绑定序号分页后序号从1开始的解决方案
问题描述:iview使用table 中type: "index",分页之后 ,索引还是从1开始,试过绑定后台返回数据的id, 这种方法可行,就是后台返回数据的每个页面id都不完全是按照从1开始的升序,因此百度了下,找到了…...
Objective-C常用命名规范总结
【OC】常用命名规范总结 文章目录 【OC】常用命名规范总结1.类名(Class Name)2.协议名(Protocol Name)3.方法名(Method Name)4.属性名(Property Name)5.局部变量/实例变量(Local / Instance Variables&…...
智能在线客服平台:数字化时代企业连接用户的 AI 中枢
随着互联网技术的飞速发展,消费者期望能够随时随地与企业进行交流。在线客服平台作为连接企业与客户的重要桥梁,不仅优化了客户体验,还提升了企业的服务效率和市场竞争力。本文将探讨在线客服平台的重要性、技术进展、实际应用,并…...
今日科技热点速览
🔥 今日科技热点速览 🎮 任天堂Switch 2 正式发售 任天堂新一代游戏主机 Switch 2 今日正式上线发售,主打更强图形性能与沉浸式体验,支持多模态交互,受到全球玩家热捧 。 🤖 人工智能持续突破 DeepSeek-R1&…...
Java入门学习详细版(一)
大家好,Java 学习是一个系统学习的过程,核心原则就是“理论 实践 坚持”,并且需循序渐进,不可过于着急,本篇文章推出的这份详细入门学习资料将带大家从零基础开始,逐步掌握 Java 的核心概念和编程技能。 …...
uniapp中使用aixos 报错
问题: 在uniapp中使用aixos,运行后报如下错误: AxiosError: There is no suitable adapter to dispatch the request since : - adapter xhr is not supported by the environment - adapter http is not available in the build 解决方案&…...
SQL慢可能是触发了ring buffer
简介 最近在进行 postgresql 性能排查的时候,发现 PG 在某一个时间并行执行的 SQL 变得特别慢。最后通过监控监观察到并行发起得时间 buffers_alloc 就急速上升,且低水位伴随在整个慢 SQL,一直是 buferIO 的等待事件,此时也没有其他会话的争抢。SQL 虽然不是高效 SQL ,但…...
云原生安全实战:API网关Kong的鉴权与限流详解
🔥「炎码工坊」技术弹药已装填! 点击关注 → 解锁工业级干货【工具实测|项目避坑|源码燃烧指南】 一、基础概念 1. API网关(API Gateway) API网关是微服务架构中的核心组件,负责统一管理所有API的流量入口。它像一座…...
C++课设:简易日历程序(支持传统节假日 + 二十四节气 + 个人纪念日管理)
名人说:路漫漫其修远兮,吾将上下而求索。—— 屈原《离骚》 创作者:Code_流苏(CSDN)(一个喜欢古诗词和编程的Coder😊) 专栏介绍:《编程项目实战》 目录 一、为什么要开发一个日历程序?1. 深入理解时间算法2. 练习面向对象设计3. 学习数据结构应用二、核心算法深度解析…...
什么是VR全景技术
VR全景技术,全称为虚拟现实全景技术,是通过计算机图像模拟生成三维空间中的虚拟世界,使用户能够在该虚拟世界中进行全方位、无死角的观察和交互的技术。VR全景技术模拟人在真实空间中的视觉体验,结合图文、3D、音视频等多媒体元素…...
