【RabbitMQ问题踩坑】RabbitMQ设置手动ack后,消息队列有多条消息,只能消费一条,就不继续消费了,这是为什么 ?
现象:我发送5条消息到MQ队列中,同时,我在yml中设置的是需要在代码中手动确认,但是我把代码中的手动ack给关闭了,会出现什么情况?
yml中配置,配置需要在代码中手动去确认消费者消费消息成功,
正常情况 需要在处理完消费的业务逻辑之后,通过channel.basicAck(tag, false);;来给MQ反馈消息已经被消费,也就是手动ack
这种正常的情况表现为: 我发送成功在postman中
其实被消费了已经,所以ready的数目为0,但是MQ还在等待ack回应,我这里注释了,所以在unacked这里会多一个;
此时如果队列中有3条消息的话,也就是ready中存在3条消息,unacked中存在一条,也就是total为4条,那及时其他的消息我修改代码,重新项目了,把注释的手动ack给放开了,那MQ中的情况也不会变,因为如果在代码中设置了消费者需要需要手动ack的话,如果一但存在了未ack的消息【unacked】的消息,那ready中都不会被消费
spring:rabbitmq: listener: #这个在测试消费多个消息的时候,不能有下面这些配置,否则只能消费一个消息后就不继续消费了simple:acknowledge-mode: manual #指定MQ消费者的确认模式是手动确认模式 这个在消费者者模块配置 设置手动确认(ack)prefetch: 1 #一次只能消费一条消息 这个在消费者者模块配置
有个文献中的解析如下:
Rabbit 中的 channel.basicAck 注释掉,只能消费掉一个消息吗?
在 RabbitMQ 中,当你使用手动消息确认(manual message acknowledgment)模式时, channel.basicAck 方法用于向 RabbitMQ 发送一个确认消息,告知 RabbitMQ 某个消息已经被成功处理。如果你注释掉 channel.basicAck调用,那么 RabbitMQ 将不会收到这个消息已经被处理的确认,并且会根据你的消费者配置来决定如何处理这个消息。
具体行为取决于你的消费者配置中的 autoAck 参数(在某些客户端库中可能称为 noAck或其他名称)
1.如果 autoAck 被设置为 true (也就是不配置 acknowledge-mode: manual,默认是自动ack )
当你从队列中获取一个消息时,RabbitMQ 会立即认为这个消息已经被处理并自动将其从队列中删除。在这种情况下,即使你注释掉 channel.basicAck,RabbitMQ也不会等待任何确认,并且会继续发送下一个消息给消费者。因此,你可以消费掉多个消息,但请注意,如果消费者在处理消息时失败并崩溃,这些消息将会丢失(因为 RabbitMQ 认为它们已经被处理了)。
2.如果 autoAck 被为手动的话:(yml中的 手动ack配置为手动 acknowledge-mode: manual):
当你从队列中获取一个消息时,RabbitMQ 会等待消费者发送一个确认消息(即 channel.basicAck)。如果消费者注释掉了这个确认调用,RabbitMQ将不会收到任何确认,并且会根据你设置的 basicQos 方法中的 prefetchcount 参数来决定是否继续发送下一个消息。
- 如果 prefetch 大于 1,RabbitMQ 可能会继续发送下一个消息给消费者,但请注意,消费者最多只会同时处理 prefetchcount个未确认的消息,
- 如果 prefetch设置为1(或未设置,因为默认可能是 0,表示无限制,但这不是推荐的做法)RabbitMQ 将只发送一个消息给消费者,并等待该消息的确认。在这种情况下,如果你注释掉了消费者将只能消费一个消息,并且不会收到下一个消息,直到你发送确认或关闭连channel.basicAck接。
总之,是否只能消费一个消息取决于你的消费者配置(特别是 autoAck和 prefetch )。但是,强烈建议在手动消息确认模式下使用 acknowledge-mode: manual和合理的 prefetch值,以确保消息在处理失败时不会丢失,并控制消费者同时处理的消息数量。
我遇到的问题现象:
我在yml中是添加着需要手动ack的配置的,
操作产生这个问题的过程:
第一次消息将手动ack代码注释后产生了一个nacked的消息,这样就出现了其实被消费成功了,但是未被回应的一条消息!!注意这个条件
但是他未被回应:
之后我将手动ack加上,重启代码,并向MQ中写入3条新的消息,正常按照我们的理解的话,这三天总应该都被消费了吧,但是即使我现在加上了手动ack了,但是由于第一条未ack的消息存在,所以后面的消息也不回被消费:产生了堵塞。现象如下:
遇到这种情况,通过队列purg message也是无法去掉unacked中的消息的,只能去掉ready中的消息我们该怎么将nacked中的消息去掉呢 ?
**答案:
****在yml中注释掉手动ack的配置,
这样重启项目后,消息队列里积压的无论是ready或者unnack的消息都会被消费掉(对于ready未被消费的,被消费没问题,但是对于之前消费成功了但是未被ack的,不能轻易让他被消费掉,因为我这是在自己实验的过程中,在生产中可不能这样操作,容易导致生产事故,导致事务的重复消费,除非你在自己的消费者端添加着“幂等性校验”,也就是之前被消费成功的,未ack的不允许重复消费的校验,这总情况你可以拦住他,所以可以这样搞,否则的话,不行!特别注意这里)**
我说的方法的实验效果:
前提:0个ready的,1个unacked的,一个total的,注释配置并重启之后:
console中正常被拦住了,而且MQ队列中unacked的也没了 ,OK啦
实验结果:
相关文章:

【RabbitMQ问题踩坑】RabbitMQ设置手动ack后,消息队列有多条消息,只能消费一条,就不继续消费了,这是为什么 ?
现象:我发送5条消息到MQ队列中,同时,我在yml中设置的是需要在代码中手动确认,但是我把代码中的手动ack给关闭了,会出现什么情况? yml中配置,配置需要在代码中手动去确认消费者消费消息成功&…...

深度解码:需求跟踪的艺术与实战应用
文章目录 引言一、需求跟踪的定义二、需求跟踪矩阵2.1 需求跟踪矩阵包含的内容2.2 跟踪矩阵层级2.3 需求属性2.4 参考表格 三、需求跟踪的收益3.1 确保商业价值最大化3.2 满足客户期望3.3 范围管理3.4 决策支持3.5 提高效率和效果3.6 文档化和沟通3.7 变更管理3.8 测量和改进 四…...

数据结构——树的基础概念
目录 1.树的概念 2.树的相关概念 3.树的表示 (1)直接表示法 (2)双亲表示法 (3)左孩子右兄弟表示法 4.树在实际中的运用(表示文件系统的目录树结构) 1.树的概念 树是一种非线性的数据结构࿰…...
TimerManager和Timer
在RTSP服务器中需要一个定时器来定时发送音频帧和视频帧。音频帧每隔23ms发送一帧,视频帧每隔40ms发一帧。 因此需要两个定时器来定时发送,此时我们就需要用到一个TimerManager来管理Timer。 在TimerManager类中我们需要创建定时器文件描述符ÿ…...
手写Spring-MVC之前后置处理器与异常处理、数据库框架
Day48 手写Spring-MVC之前后置处理器与异常处理 前后置处理器 概念:从服务器获取的JSON数据可能是加密后的,因此服务端获取的时候需要进行解密(前置处理器)。 而从服务器传出的JSON数据可能需要加密,因此需要在处理返…...

学习笔记(linux高级编程)11
进程间通信 》信号通信 应用:异步通信。 中断,, 1~64;32应用编程。 如何响应: Term Default action is to terminate the process. Ign Default action is to ignore the signal. wait Core Default action is …...
vite+vue3+nginx配置统一公共前缀
方案1:重定向 server {listen 80;server_name localhost;location / {root /usr/share/nginx/html;index index.html;}location /music/ {proxy_pass http://127.0.0.1:80/;} }方案2:vitenginx双重配置 在方案1中,我们虽然能够实现 通过 …...
android 国内下载Gradle源
在中国使用 Gradle 时,可以配置使用一些国内的镜像源,以提高下载速度和稳定性。以下是几个常用的 Gradle 镜像源地址: 配置 gradle-wrapper.properties 文件: 阿里云: distributionUrlhttps\://services.gradle.org/distributions/gradle-7.…...
mysql8一键安装脚本(linux) 拿走即用
创建一个shell文件,将下面的代码放里面去,然后放到linux服务器上运行就可以了 #!/bin/bash#---------------------* # * # 2021-10-08 * # install mysql-8 * # * #---------------------*route=/usr #包存放路径 mys…...
C# 开发Winform DataGridView的增删改查实战
在C# WinForms应用程序中,DataGridView控件是一个非常强大的工具,用于显示和编辑表格数据。下面我将详细介绍如何在WinForm应用程序中使用DataGridView实现基本的数据库操作:增加、删除、修改和查询(CRUD)。 第一步&a…...
CentOS 7镜像列表服务下线,还想继续使用该怎么办?
目录 问题和解决方法 mirrorlist.centos.org 作用 vault.centos.org 作用 CentOS 7的生命周期已经在2024年6月30日终止(End of Life,EOL),官方将不再对该版本进行问题修复、功能更新以及其他形式的维护支持。这意味着使用 Cent…...
代码随想录训练营第二十八天 122买卖股票的最佳时间II 55跳跃游戏 45跳跃游戏II 1005K次取反后最大化的数组和
第一题: 原题链接:122. 买卖股票的最佳时机 II - 力扣(LeetCode) 思路: 这题十分简单,就是把相邻天数的金额相减,如果发现大于0就加到res中,返回res即可 代码如下: …...

在node环境使用MySQL
什么是Sequelize? Sequelize是一个基于Promise的NodeJS ORM模块 什么是ORM? ORM(Object-Relational-Mapping)是对象关系映射 对象关系映射可以把JS中的类和对象,和数据库中的表和数据进行关系映射。映射之后我们就可以直接通过类和对象来操作数据表和数据了, 就…...

spdlog一个非常好用的C++日志库(四): 源码分析之logger类
目录 1.简介 2.类图关系 3.logger数据成员 4.logger函数成员 4.1.构造与析构 4.1.1.构造函数 4.1.2.拷贝构造、移动构造 4.2.交换操作 4.3.log()记录日志消息 4.3.1.格式串 4.3.2.普通字符串 4.3.3.日志级别 4.3.4.宽字符支持 4.4.sink_it_:将log消息…...

逻辑这回事(七)---- 器件基础
Xilinx FPGA创建了先进的硅模块(ASMBL)架构,以实现FPGA具有针对不同应用程序领域优化的各种功能组合的平台。通过这一创新,Xilinx提供了更多的设备选择,使客户能够为其特定设计选择具有正确的功能和功能组合的FPGA。ASMBL体系结构通过以下方式突破了传统的设计障碍:消除几…...

中俄汽车产业链合作前景广阔,东方经济论坛助力双边合作与创新
随着中国汽车零部件企业的竞争力和创新能力不断增强,中国汽车及零部件行业在俄罗斯的市场份额和品牌影响力显著提升,中俄两国在汽车产业链上的合作展现出巨大的潜力和广阔的前景。2024年5月,俄罗斯乘用车新车销量达到12.8万辆,同比…...

第六篇:精通Docker Compose:打造高效的多容器应用环境
精通Docker Compose:打造高效的多容器应用环境 1. 引言 1.1 目的与重要性 在现代软件开发中,随着应用程序的复杂性不断增加,传统的单一容器部署方式已无法满足需求。Docker Compose作为一种强大的工具,专门用于定义和运行多容器…...

C++视觉开发 一.OpenCV环境配置
一.OpenCV安装环境配置 1.OpenCV安装 (1)下载 官方下载链接:http://opencv.org/releases 这边选择需要的版本,我是在windows下的4.9.0。(科学上网下载很快,否则可能会有点慢) (2)安装 双击下…...
大数据面试题之Kafka(3)
目录 Kafka支持什么语义,怎么实现ExactlyOnce? Kafka的消费者和消费者组有什么区别?为什么需要消费者组? Kafka producer的写入数据过程? Kafka producer的ack设署 Kafka的ack机制,解决了什么问题? Kafka读取消息是推还是拉的模式?有什…...

视频监控平台web客户端的免密查看视频页:在PC浏览器上如何调试手机上的前端网页(PC上的手机浏览器的开发者工具)
目录 一、手机上做前端页面开发调试 1、背景 2、视频监控平台AS-V1000的视频分享页 3、调试手机前端页面代码的条件 二、手机端的准备工作 1、手机准备 2、手机的开发者模式 3、PC和手机的连接 (1)进入调试模式 (2)选择…...
基于算法竞赛的c++编程(28)结构体的进阶应用
结构体的嵌套与复杂数据组织 在C中,结构体可以嵌套使用,形成更复杂的数据结构。例如,可以通过嵌套结构体描述多层级数据关系: struct Address {string city;string street;int zipCode; };struct Employee {string name;int id;…...

linux之kylin系统nginx的安装
一、nginx的作用 1.可做高性能的web服务器 直接处理静态资源(HTML/CSS/图片等),响应速度远超传统服务器类似apache支持高并发连接 2.反向代理服务器 隐藏后端服务器IP地址,提高安全性 3.负载均衡服务器 支持多种策略分发流量…...
oracle与MySQL数据库之间数据同步的技术要点
Oracle与MySQL数据库之间的数据同步是一个涉及多个技术要点的复杂任务。由于Oracle和MySQL的架构差异,它们的数据同步要求既要保持数据的准确性和一致性,又要处理好性能问题。以下是一些主要的技术要点: 数据结构差异 数据类型差异ÿ…...

Docker 本地安装 mysql 数据库
Docker: Accelerated Container Application Development 下载对应操作系统版本的 docker ;并安装。 基础操作不再赘述。 打开 macOS 终端,开始 docker 安装mysql之旅 第一步 docker search mysql 》〉docker search mysql NAME DE…...
为什么要创建 Vue 实例
核心原因:Vue 需要一个「控制中心」来驱动整个应用 你可以把 Vue 实例想象成你应用的**「大脑」或「引擎」。它负责协调模板、数据、逻辑和行为,将它们变成一个活的、可交互的应用**。没有这个实例,你的代码只是一堆静态的 HTML、JavaScript 变量和函数,无法「活」起来。 …...
关于uniapp展示PDF的解决方案
在 UniApp 的 H5 环境中使用 pdf-vue3 组件可以实现完整的 PDF 预览功能。以下是详细实现步骤和注意事项: 一、安装依赖 安装 pdf-vue3 和 PDF.js 核心库: npm install pdf-vue3 pdfjs-dist二、基本使用示例 <template><view class"con…...

消防一体化安全管控平台:构建消防“一张图”和APP统一管理
在城市的某个角落,一场突如其来的火灾打破了平静。熊熊烈火迅速蔓延,滚滚浓烟弥漫开来,周围群众的生命财产安全受到严重威胁。就在这千钧一发之际,消防救援队伍迅速行动,而豪越科技消防一体化安全管控平台构建的消防“…...

yaml读取写入常见错误 (‘cannot represent an object‘, 117)
错误一:yaml.representer.RepresenterError: (‘cannot represent an object’, 117) 出现这个问题一直没找到原因,后面把yaml.safe_dump直接替换成yaml.dump,确实能保存,但出现乱码: 放弃yaml.dump,又切…...

break 语句和 continue 语句
break语句和continue语句都具有跳转作用,可以让代码不按既有的顺序执行 break break语句用于跳出代码块或循环 1 2 3 4 5 6 for (var i 0; i < 5; i) { if (i 3){ break; } console.log(i); } continue continue语句用于立即终…...

短视频时长预估算法调研
weighted LR o d d s T p 1 − p ( 1 − p ) o d d s T p ( T p o d d s ∗ p ) o d d s p o d d s T o d d s odds \frac{Tp}{1-p} \newline (1-p)odds Tp \newline (Tp odds * p) odds \newline p \frac{odds}{T odds} \newline odds1−pTp(1−p)oddsTp(Tpodds…...