RabbitMQ的ack和nack机制

article/2025/10/6 15:52:39

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • 前言
  • 一、ACK机制
  • 二、主动ACK
  • 三、手动ACK
  • 四、Nack机制
  • 五、MQ unack的影响
  • 总结


前言

本文主要讨论RabbitMQ消费者的ack和nack机制,并且关注ack和nack使用上的问题记录,必要大家踩坑。

在这里插入图片描述

一、ACK机制

当生产者的发送消息到exchange,并路由到对应的队列后,MQ主动push消息到channel,由应用线程从channel中获取消息。
在这里插入图片描述

二、主动ACK

主动ACK是指在MQ主动push到channel中后,channel立马自动的给到MQ ack响应,然后MQ删除消息。
MQ使用的问题点:
1、当消费者宕机的情况下,会导致消息丢失,因为MQ已经删除了对应的消息。
2、只要队列中存在消息,MQ就会全部推送给消费者的channel。如果数据量过大,存在拖垮消费者的风险。

所以,一般使用MQ的时候选择使用手动ACK避免因消费者宕机等异常情况,导致消息丢失。

三、手动ACK

手动ACK即需要消费者主动的调用channel.ack()去通知MQ集群删除消息。
为了解决上面的第二个问题,手动ACK,一般需要搭配channel.basicQos()一起使用。Qos指的是预取量。即MQ每次发送给channel的未确认数量。
使用手动ACK也会出现如下的问题:
1、当消费逻辑发生异常后,消费者一直未主动调用channel.basicAck(),导致MQUnack数量骤升,导致MQ性能下降,甚至崩溃。
2、使用Qos,但是消费逻辑失败,未主动Ack,导致Mq unack的数量超过Qos的值。MQ将不再给消费者分配消息,阻塞整个队列,导致消息推积。

为了解决上面消费失败未主动ACK问题:
思路便是:
捕获消费处理的异常,消费成功调用channel.basicAck(). 消费失败时调用channel.basicNack()告诉MQ,消息消费失败了。

四、Nack机制

但是使用channel.basicNack又会引发另外的问题:
问题是当调用channel.basicNack后,消息会被重新存放的MQ队列的头部。下一步又消费这条会出异常的消息,又出错,塞回队列……
进入了死循环了,当然新的消息不会消费,导致堆积了。

为了解决消费失败后死循环的问题
1.创建死信队列,消费失败后通过调用channel.basicReject()进入死信队列。
2.消费失败后,存入存储中间件(Mysql , redis)等进行重试消费。

五、MQ unack的影响

接下来我们来分析下MQ中unack的数量过多的影响。
RabbitMq的设计就是允许消费者客户端很久不做ack,所以对于unack的消息,RabbitMQ并不会主动的去删除消息。并且MQ的的unack消息是存放在内存的,当队列中unack消息过多,会占用大量内存,导致MQ性能下架。除非consumer断连。这些unack的消息才会重新回到reday状态。

总结

为了解决上述使用RabbitMQ-ack的问题。
1、为了提供消息可靠性,应该使用RabbitMQ的手动Ack。
2、选择合适Qos值,一般建议100-300。太少可能存在队列推积,太多会占用MQ的内存。
3、当消费失败后,不能使用channel.basicNack() ,应该配合死信队列和存储中间件进行重试。
4、开启手动ACK后需要及时主动ack,避免因MQ unack数量骤升导致的MQ性能下降。


http://chatgpt.dhexx.cn/article/hmkfc2nW.shtml

相关文章

RTCP 协议的 NACK 报文

接收方定时把所有未收到的包序号通过反馈报文通知到发送方进行重传。 相对 ARQ带来的改进:减少的反馈包的频率和带宽占用,同时也能比较及时地通知发送方进行丢包重传。 NACK 报文的定义在 [rfc4585] 文档中定义。 RTCP 的反馈报文包头定义如下&#x…

webrtc nack实现原理

1.nack 简介 webrtc 中nack是最基本的QOS策略,与ack机制不同的地方是nack是接收端检测到丢包时,告知发送端具体丢包的序号,接收端收到nack后从缓存中找到对应的包并发送出去。 2. nack实现 nack rtcp报文格式如上图所示,pt205。P…

webrtc QOS方法一(NACK实现)

一:概述 NACK则在接收端检测到数据丢包后,发送NACK报文到发送端;发送端根据NACK报文中的序列号,在发送缓冲区找到对应的数据包,重新发送到接收端。NACK需要发送端发送缓冲区的支持,RFC5104[2]定义NACK数据包…

认识网络通信中的 ACK、NACK 和 REX

ACK、NACK、 REX在面试或者网络通信的时候,我们可能经常听到和遇到。今天就来详细介绍一下ACK、NACK、 REX。 认识ACK、NACK、 REX ACK:Acknowledgement,它是一种正向反馈,接收方收到数据后回复消息告知发送方。NACK&#xff1a…

WebRTC之NACK、RTX 在什么时机判断丢包发送NACK请求和RTX丢包重传

WebRTC之NACK、RTX 在什么时机判断丢包发送NACK请求和RTX丢包重传 WebRTC之NACK、RTX 在什么时机判断丢包发送NACK请求和RTX丢包重传 WebRTC之NACK、RTX 在什么时机判断丢包发送NACK请求和RTX丢包重传前言一、NACK与RTX的作用1、NACK/RTX的工作机制的流程图2、NACK/RTX涉及到的…

WebRTC 的音频弱网对抗之 NACK

本文梳理 WebRTC 的音频弱网对抗中的 NACK 机制的实现。音频的 NACK 机制在 WebRTC 中默认是关闭的,本文会介绍开启 NACK 机制的方法。 在网络数据传输中,NACK (NAK,negative acknowledgment,not acknowledged) 是数据接收端主动…

流媒体弱网优化之路(NACK)——纯NACK方案的优化探索

流媒体弱网优化之路(NACK)——纯NACK方案的优化探索 —— 我正在的github给大家开发一个用于做实验的项目 —— github.com/qw225967/Bifrost目标:可以让大家熟悉各类Qos能力、带宽估计能力,提供每个环节关键参数调节接口并实现一个json全配置&#xff…

WebRTC源码分析 nack详解

1、Nack过程 1.1 nack是什么 丢包重传(NACK)是抵抗网络错误的重要手段。NACK在接收端检测到数据丢包后,发送NACK报文到发送端;发送端根据NACK报文中的序列号,在发送缓冲区找到对应的数据包,重新发送到接收端。NACK需要发送端&am…

谈谈网络通信中的 ACK、NACK 和 REX

目录 名词解释 问题 1: 接收方如何判断数据包是否丢失? 问题 2:发送方如何确认数据包已经丢失? 问题 3:重传超时的计算规则? 问题 4:发送方的数据包要缓存多久? 问题 5&#x…

费马定理_高数_1元微积分

定理 设 f(x) 在 x0 点处满足:1、可导 2、取得极值,则有 f ’ (x0)0 证明 不妨假设 f(x) 在点 x0 处取得极大值,则存在 x0 的邻域 U( x0 ),对任意的 x属于U( x0 ),都有 根据导数定义与极限的保号性有 又 f(x) 在点…

老猿Python博客文章目录索引

本目录提供老猿Python所有相关博文的一级目录汇总,带星号的为付费专栏: 一、专栏列表 本部分为老猿所有专栏的列表,每个专栏都有该专栏置顶的博文目录: Python基础教程目录PyQt入门学习* 使用PyQt开发图形界面Python应用PyQtmo…

(组合数+快速幂+lucas+费马小引理)acwing 887. 求组合数 III

887. 求组合数 III 题目链接https://www.acwing.com/problem/content/889/ 题目&#xff1a; 思路&#xff1a; #include<iostream> #include<cstdio> using namespace std; typedef long long LL; int n; int qmi(LL a,int k,int p){int res1;while(k){if(k&…

(组合数 +快速幂+逆元+费马小引理)acwing 886. 求组合数 II

886. 求组合数 II 题目链接https://www.acwing.com/problem/content/888/ 题目&#xff1a; 思路&#xff1a; #include<iostream> #include<cstdio> using namespace std; typedef long long LL; const int mod1e97;//mod为质数 int a,b,n; int fact[100010],…

Leetcode-数学费马平方和定理-633. 平方数之和

题目633. 平方数之和&#xff1a; 题解&#xff1a; 1&#xff0c;暴力枚举sqrt class Solution { public:bool judgeSquareSum(int c) {if(c < 2 ){return true;}for(long a 0; a*a < c; a){double b sqrt(c - a * a);if((int)b b){return true;}}return false;} …

费马定理、罗尔中值定理、零点存在定理、拉格朗日中值定理、

介值定理 介值定理如果AB,则开区间&#xff08;a,b&#xff09;内可能取不到端点值A,B 即介值定理如果C不等于端点值&#xff0c;那么 ξ ξ ξ可以是属于开区间&#xff0c;如果C等于端点值&#xff0c;那么 ξ ξ ξ必须属于闭区间。 零点存在定理 假设函数f(x)在闭区间[a,…

费马引理的证明

设 f(x)在 ξ处最大&#xff0c;故不论Δx是正或负&#xff0c;总有 设 &#xff0c; 则 。 故由极限的保号性有 &#xff08;1&#xff09; 而当 时&#xff0c; &#xff0c; 故 &#xff08;2&#xff09; 由(1)&#xff0c;(2)两式及 存在知&#xff0c;必有 设 f(x)在 ξ处…

费马引理

转载于:https://www.cnblogs.com/fuhang/p/7976329.html

高等数学——微分中值定理

本文始发于个人公众号&#xff1a;TechFlow&#xff0c;原创不易&#xff0c;求个关注 今天和大家回顾一下高数当中的微分中值定理&#xff0c;据说是很多高数公式的基础。由于本人才疏学浅&#xff0c;所以对于这点没有太深的认识。但是提出中值定理的几个数学家倒是如雷贯耳&…