Rabbitmq高级特性之消费方确认

背景:

发送方发送消息之后,到达消费端之后,可能会有以下情况:消息处理成功,消息处理异常。RabbitMQ在向消费者发送消息之后,就会把这条消息给删除掉,那么第二种情况,就会造成消息丢失,为了保证是顺利到达消费方,RabbitMQ提供了消息确认机制。消费者在订阅队列时,可以指定autoAck参数,根据这个参数设置,消息确认机制分为以下两种:自动确认和手动确认。

RabbitMQ原生api中的消费消息的方法:

ps:接下的代码都是基于AMQP来实现的(基于Spring对RabbitMQ进行了一层封装)

1.手动确认

当autoAck为false的时候,RabbitMQ会等待消费者显式的调用Basic.Ack命令,回复确认信号后才从内存或磁盘中移去消息,该种方式适合对消息可靠性要求比较高的场景。

(1)application.yml配置

要基于AMQP实现手动确认,只需修改application.yml(或.properities)的配置:

manual:手动确认,必须显示调用basicAck方法来确认消息,如果消息未被确认,RabbitMQ会认为消息尚未被成功处理,并且会在消费者可用时重新投递该消息,这种模式提高了消息处理的可靠性,因为即使消费方消费失败,消息也不会消失,而是可以被重新处理。

auto:自动确认,这种模式下,消费者在消息处理成功时会自动确认消息,但是如果处理过程中出现异常,则不会确认消息。

none:这种模式下,无论消费者有没有处理成功消息,RabbitMQ都会自动确认消息,从RabbitMq中移除消息,如果消息处理失败,那么可能会导致丢失。

(2)manual方式示例

config配置类:

controller类:

 listen类:

 现在开启手动确认,但是却没有手动确认,此时访问对应接口(127.0.0.1:8080/producer/ack):

启动台打印:

RabbitMQ管理界面:

未被确认的消息会在合适时机重新入队,有消费者监听队列时,投递给消费者进行消费。

 现在进行修改代码:

 刚才滞留的消息,会立即被重新消费,此时已经进行了手动确认:

查看RabbitMQ管理界面:

 滞留的消息确认已经被重新消费了。

2.自动确认

自动确认开启的情况下,会自动把发送出去大的消息置为确认,然后从内存中(或者硬盘)删除,而不管消费者是否真正地消费到了这些消息,自动确认模式适合对于消息可靠性要求不高的场景。

有auto和none,两者在未发生异常的情况下是相同:自动确认消息。

2.1 auto方式示例

(1)application.yml配置文件:

(2)controller类:

(3)producer类:

(4)正常启动,并访问接口127.0.0.1:8080/producer/ack:

观察RabbitMQ管理界面:(消息发送到消费端后,消费成功后就从RabbitMQ上移除了)

(5)设置异常,然后启动并访问接口127.0.0.1:8080/producer/ack:

可以看到客户端在不断报错:

这是因为在auto模式下,如果在消费过程中出现异常,消费会立即重新入队进行消费,由于还是一个消费方,所以会一直报错(一直重复上述过程),观察RabbitMQ管理界面也可以看到中有一条消息处于Ready状态(这也是会一直重新入队消费的原因,不同manual方式下如果没有手动确认的消息会处于Unacked状态下,只有进行了手动确认才会从RabbitMQ中移除)

 2.2 none方式示例

(1)application.yml配置文件:

(2)producer类:

(3)controller类:

(4)正常启动,并访问接口127.0.0.1:8080/producer/ack:

(5)设置异常,启动并访问接口127.0.0.1:8080/producer/ack:

出现报错:

RabbitMQ管理界面:

可以看到消息丢失。

3. 手动确认的相关方法

(1)basicAck

第一个参数(deliveryTag):消息的唯一标识,是每一个通道(channel)独立维护的,所以在每一个通道上都是唯一的,当消费者手动确认一条消息的时候,都必须使用对应的通道进行。

第二个参数(multiple):是否批量确认,在某些情况下,为了减少网络流量,可以对一系列连续的deliveryTag进行批量确认,值为true则会一次性ack确认所有小于或等于指定的deliveryTag的消息;为false,则只会确认当前的消息。

(2)basicReject

第一个参数参考basicAck。

第二个参数(requeue):是否重新入队,表示拒绝后,该条消息如何处理,如果设置为true,那么在消息处理失败后,会重新入队,以便发送给下一个监听该队列的消费者,如果设置为false,则RabbitMQ会把这条消息从队列中移除,而不会把消息发送给下一个监听的消费者。

(3)basicNack

和basciReject都是否定确认,不同的是basicNack可以批量拒绝消息。 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/pingmian/68063.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于微信小程序的健身管理系统设计与实现(LW+源码+讲解)

专注于大学生项目实战开发,讲解,毕业答疑辅导,欢迎高校老师/同行前辈交流合作✌。 技术范围:SpringBoot、Vue、SSM、HLMT、小程序、Jsp、PHP、Nodejs、Python、爬虫、数据可视化、安卓app、大数据、物联网、机器学习等设计与开发。 主要内容:…

Couchbase UI: Server

在 Couchbase UI 中的 Server(服务器)标签页主要用于管理和监控集群中的各个节点。以下是 Server 标签页的主要内容和功能介绍: 1. 节点列表 显示集群中所有节点的列表,每个节点的详细信息包括: 节点地址&#xff1…

Spark Streaming编程基础

文章目录 1. 流式词频统计1.1 Spark Streaming编程步骤1.2 流式词频统计项目1.2.1 创建项目1.2.2 添加项目依赖1.2.3 修改源目录1.2.4 添加scala-sdk库1.2.5 创建日志属性文件 1.3 创建词频统计对象1.4 利用nc发送数据1.5 启动应用,查看结果 2. 编程模型的基本概念3…

git和idea重新安装后提交异常

场景:我重装了系统,idea装了2024.3版本的,git也重新装了,但是项目中还是有.git文件夹的,下载了idea的码云插件后,提交报错如下: 异常:Error updating changes: detected dubious ow…

Pix2Pix:图像到图像转换的条件生成对抗网络深度解析

在深度学习的广阔领域中,图像到图像的转换任务一直是研究者和开发者们关注的热点。Pix2Pix,作为一种基于条件生成对抗网络(Conditional Generative Adversarial Networks, CGANs)的模型,自2017年由Phillip Isola等人提…

OpenCV imread函数读取图像__实例详解

OpenCV imread函数读取图像__实例详解 本文目录: 零、时光宝盒 一、imread函数定义 二、imread函数支持的文件格式 三、imread函数flags参数详解 (3.1)、Flags-1时,样返回加载的图像(使用alpha通道,否…

Spring 框架基础:IOC 与 AOP 原理剖析及面试要点

在上一篇中,我们深入探讨了 Java 反射机制,了解了它在运行时动态操作类和对象的强大能力。而今天,我们将进入 Spring 框架的世界。Spring 框架作为 Java 企业级开发中最流行的框架之一,极大地简化了企业级应用的开发过程。对于春招…

ssm基于HTML5的红酒信息分享系统

SSM基于HTML5的红酒信息分享系统是一个专注于红酒领域的综合性信息平台,旨在为红酒爱好者、从业者以及普通消费者提供一个便捷的交流与获取红酒相关信息的空间。 一、系统背景与意义 随着人们生活水平的提高和消费观念的转变,红酒作为一种高雅的饮品&a…

【python】subprocess.Popen执行adb shell指令进入linux系统后连续使用指令,出现cmd窗口阻塞问题

问题描述 subprocess.Popen执行adb shell指令进入linux系统后出现cmd窗口阻塞问题,需要手动关闭cmd才会继续执行其他指令。 解决方案 1、cmd指令后面加入exit\n关闭exe进程 2、subprocess.Popen()添加内置参数creationflagssubprocess.CREATE_NO_WINDOW隐藏窗口弹…

细说机器学习算法之过拟合与欠拟合

系列文章目录 第一章:Pyhton机器学习算法之KNN 第二章:Pyhton机器学习算法之K—Means 第三章:Pyhton机器学习算法之随机森林 第四章:Pyhton机器学习算法之线性回归 第五章:Pyhton机器学习算法之有监督学习与无监督…

深度学习中的通道(Channel)概念详解

1. 通道的基本概念 通道(Channel)是深度学习中的一个重要概念,它在不同场景下有不同的具体含义。理解通道概念对于理解深度学习模型的结构和工作原理至关重要。 2. 大语言模型中的通道 2.1 全连接层的通道概念 2.1.1 基本结构 输入:[batch_size, in…

Windows Docker Desktop安装及使用 Docker 运行 MySQL

Docker Desktop是Docker的官方桌面版,专为Mac和Windows用户设计,提供了一个简单易用的界面来管理和运行Docker容器。它集成了Docker引擎,为开发人员提供了一个快速、可靠、可扩展的方式来构建、运行和管理应用。DockerDesktop的优势在于&…

TTL 在 Redis 缓存中的作用

Redis TTL(Time To Live)与缓存的关系 TTL(Time To Live,生存时间)是 Redis 提供的一种自动过期机制,用于控制键值对的存活时间。当 TTL 到期后,Redis 会自动删除该键,避免长期占用…

人形机器人,自动驾驶“老炮”创业第二站

造一台人形机器人,或许正在成为2025年最炙手可热的事情。 从去年第四季度开始,伴随着大模型应用的深入,具身智能概念被点燃,其中最鲜明的一个特点是,大量自动驾驶大佬的转行加入。 随便说几个比较有分量的&#xff0…

MFC常用操作

1,获取STATIC控件的值 CString str; m_STATIC2.GetWindowText(str);//获取STATIC控件的值 MessageBox(str); 2.设置EDIT控件的值 m_EDIT2.SetWindowText(str); GetDlgItem(IDC_EDIT1)->SetWindowText("Leave"); 3.移动控件 m_EDIT2.SetWindowPos(…

Flutter_学习记录_基本组件的使用记录

1.TextWidge的常用属性 1.1TextAlign: 文本对齐属性 常用的样式有: TextAlign.center 居中TextAlign.left 左对齐TextAlign.right 有对齐 使用案例: body: Center(child: Text(开启 TextWidget 的旅程吧,珠珠, 开启 TextWidget 的旅程吧&a…

什么是COLLATE排序规则?

在当今数字化世界中,数据的整理、比较和排序是至关重要的。在数据库管理和编程语言中,我们经常需要对字符串进行排序,以展示或处理信息。为了实现这一点,各种系统和工具提供了排序规则,其中COLLATE排序规则就是其中的一…

打印输入单词字符数量统计直方图-C语言第二版

1. 编程要求 多年前写过一篇用 C 语言实现打印单词字符数量统计的直方图的文章, 现在看上去有些混乱, 对一些任务划分不清晰, 全部混在一起. 于是重写了这个编程题, 希望可以给初学者一些参考, 并且我分别用 C, C, Java, Python 四种语言完成了这道编程题, 有兴趣的可以看我另…

【QT】-explicit关键字

explicit explicit 是一个 C 关键字,用于修饰构造函数。它的作用是防止构造函数进行隐式转换。 为什么需要 explicit? 在没有 explicit 的情况下,构造函数可以用于隐式类型转换。这意味着,如果你有一个接受某种类型的参数的构造…

【C++模板】:如何判断自定义类型是否实现某个函数

一、引子 偶尔我们会面对这样的尴尬的场景,我们需要显示的去判断在某个自定义类型中,是否已经提供了我们期待的API接口,以避免产生“莫须有”的错误。阁下该如何破解此问题! 这里,直接给出一种通用的方法,…