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.rhkb.cn/news/6671.html

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

相关文章

[C]基础8.详解操作符

博客主页:算法歌者本篇专栏:[C]您的支持,是我的创作动力。 文章目录 0、总结1、操作符的分类2、二进制和进制转换2.1、2进制转10进制2.2、10进制转2进制2.3、2进制转8进制和16进制 3、原码、反码、补码4、移位操作符4.1 左移操作符4.2 右移操…

【豆包MarsCode蛇年编程大作战】花样贪吃蛇

目录 引言 展示效果 prompt提示信息 第一次提示(实现基本功能) 初次实现效果 第二次提示(美化UI) 第一次美化后的效果 第二次美化后的效果 代码展示 实现在线体验链接 码上掘金使用教程 体验地址: 花样贪吃蛇…

【Maui】注销用户,采用“手势”点击label弹窗选择

文章目录 前言一、问题描述二、解决方案三、软件开发(源码)3.1 方法一:前端绑定3.2 方法二:后端绑定3.3 注销用户的方法 四、项目展示 前言 .NET 多平台应用 UI (.NET MAUI) 是一个跨平台框架,用于使用 C# 和 XAML 创…

RoCE网络及其协议栈详解(没有中间商赚差价的网络)

引言 随着数据中心对高性能、低延迟通信需求的不断增长,传统的TCP/IP以太网连接已经难以满足现代应用的要求。为了解决这些问题,RDMA(Remote Direct Memory Access)技术应运而生。RDMA是一种允许网络中的不同计算机直接访问对方内…

数据结构:二叉树—面试题(一)

目录 1、相同的树 2、另一棵树的子树 3、翻转二叉树 4、平衡二叉树 5、对称二叉树 6、二叉树遍历 7、二叉树的分层遍历 1、相同的树 习题链接https://leetcode.cn/problems/same-tree/description/https://leetcode.cn/problems/same-tree/description/ 描述&#xff1a…

2025年新开局!谁在引领汽车AI风潮?

汽车AI革命已来。 在2025年伊始开幕的CES展上,AI汽车、AI座舱无疑成为了今年汽车行业的最大热点。其中不少车企在2025年CES上展示了其新一代AI座舱,为下一代智能汽车的人机交互、场景创新率先打样。 其中,东软集团也携带AI驱动、大数据支撑…

HarmonyOS Next 应用UI生成工具介绍

背景 HarmonyOS Next适配开发过程中难买难要参考之前逻辑,但是可能时间较长文档不全,只能参考Android或iOS代码,有些逻辑较重的场景还可以通过AI工具将Android 的Java代码逻辑转成TS完成部分复用。对于一些UI场景只能手动去写,虽…

python学opencv|读取图像(四十一 )使用cv2.add()函数实现各个像素点BGR叠加

【1】引言 前序已经学习了直接在画布上使用掩模,会获得彩色图像的多种叠加效果,相关文章链接为: python学opencv|读取图像(四十)掩模:三通道图像的局部覆盖-CSDN博客 这时候如果更进一步,直接…

宝塔Linux+docker部署nginx出现403 Forbidden

本文主要讲述了宝塔docker部署nginx出现403 Forbidden的原因,以及成功部署前端的方法步骤。 目录 1、问题描述2、问题检测2.1 检测监听端口是否异常2.2 检测Docker容器是否异常2.2.1 打开宝塔Linux的软件商店,找到Docker管理器,查看前端容器是…

PVE 虚拟机安装 Debian 无图形化界面服务器

Debian 安装 Debian 镜像下载 找一个Debian镜像服务器,根据需要的版本和自己硬件选择。 iso-cd/:较小,仅包含安装所需的基础组件,可能需要网络访问来完成安装。有镜像 debian-12.9.0-amd64-netinst.isoiso-dvd/:较…

docker环境搭建,docker拉取mysql,docker制作自定义C++镜像

目录 centos 安装和使用 dockerdocker拉取mysql使用可执行文件制作docker镜像Dockerfile文件优化Dockerfile简介Dockerfile优化 centos 安装和使用 docker yum install docker systemctl start docker systemctl status docker# 查询docker版本 docker version # 查询docker基…

2025牛客寒假算法营2

A题 知识点&#xff1a;模拟 打卡。检查给定的七个整数是否仅包含 1,2,3,5,6 即可。为了便于书写&#xff0c;我们可以反过来&#xff0c;检查这七个整数是否不为 4 和 7。 时间 O(1)&#xff1b;空间 O(1)。 #include <bits/stdc.h> using namespace std;signed main()…

STM32 FreeRTOS中断管理

目录 FreeRTOS的中断管理 1、STM32中断优先级管理 2、FreeRTOS任务优先级管理 3、寄存器和内存映射寄存器 4、BASEPRI寄存器 5、FreeRTOS与STM32中断管理结合使用 vPortRaiseBASEPRI vPortSetBASEPRI 6、FromISR后缀 7、在中断服务函数中调用FreeRTOS的API函数需注意 F…

【ComfyUI】python调用生图API,实现批量出图

官方给的示例&#xff1a; https://github.com/comfyanonymous/ComfyUI/blob/master/script_examples/websockets_api_example.pyhttps://github.com/comfyanonymous/ComfyUI/blob/master/script_examples/websockets_api_example.pyhttps://github.com/comfyanonymous/ComfyU…

在Docker 容器中安装 Oracle 19c

在 Docker 容器中安装 Oracle 19c 是可行的&#xff0c;但它相较于其他数据库&#xff08;如 MySQL、PostgreSQL 等&#xff09;会复杂一些&#xff0c;因为 Oracle 数据库有一些特定的要求&#xff0c;如操作系统和库的依赖&#xff0c;以及许可证问题。 不过&#xff0c;Ora…

macos的图标过大,这是因为有自己的设计规范

苹果官方链接&#xff1a;App 图标 | Apple Developer Documentation 这个在官方文档里有说明&#xff0c;并且提供了sketch 和 ps 的模板。 figma还提供了模板&#xff1a; Figma

告别手动编辑:如何用Python快速创建Ansible hosts文件?

在自动化运维领域&#xff0c;Ansible是一款非常强大的工具&#xff0c;它可以帮助我们管理和配置大量的服务器。为了让Ansible能够有效地管理这些服务器&#xff0c;我们需要一个hosts清单文件&#xff0c;该文件定义了Ansible要管理的目标主机。在实际应用中&#xff0c;我们…

macOS安装Gradle环境

文章目录 说明安装JDK安装Gradle 说明 gradle8.5最高支持jdk21&#xff0c;如果使用jdk22建议使用gradle8.8以上版本 安装JDK mac系统安装最新&#xff08;截止2024.9.13&#xff09;Oracle JDK操作记录 安装Gradle 下载Gradle&#xff0c;解压将其存放到资源java/env目录…

【嵌入式】总结——Linux驱动开发(三)

鸽了半年&#xff0c;几乎全忘了&#xff0c;幸亏前面还有两篇总结。出于快速体验嵌入式linux的目的&#xff0c;本篇与前两篇一样&#xff0c;重点在于使用、快速体验&#xff0c;uboot、linux、根文件系统不作深入理解&#xff0c;能用就行。 重新梳理一下脉络&#xff0c;本…

【29】Word:李楠-学术期刊❗

目录 题目​ NO1.2.3.4.5 NO6.7.8 NO9.10.11 NO12.13.14.15 NO16 题目 NO1.2.3.4.5 另存为手动/F12Fn光标来到开头位置处→插入→封面→选择花丝→根据样例图片&#xff0c;对应位置填入对应文字 (手动调整即可&#xff09;复制样式&#xff1a;开始→样式对话框→管理…