RabbitMQ(三)消费端ack机制

日常记录-SpringBoot整合RabbitMQ第四节(消费者确认) 如果出现异常,就给RabbitMQ返回nack消费失败。实际开发中,比较优雅的一个方案是RepublishMessageRecoverer,将失败消息重新投递到一个专门用于存储异常消息的队列中,等待后续人工处理。开发人员在处理完业务后,调用RabbitMQ封装好的API,向RabbitMQ返回ack确认消费成功或者消费失败。在刚刚的本地重试中,在达到最大次数后,消息会被丢弃,这是Spring内部机制决定的。这样就实现了异常消息重试耗尽后,就会投递到指定的异常队列中去,等待人工处理了。 阅读详情

ACK机制

什么是消息确认ACK

如果在处理消息的过程中,消费者的服务器在处理消息的时候出现异常,那么可能这条正在处理的消息就没有完成消息消费,数据就会丢失。为了确保数据不会丢失,RabbitMQ支持消息确定-ACK。

ACK的消息确认机制

ACK机制是消费者从RabbitMQ收到消息并处理完成后,反馈给RabbitMQ,RabbitMQ收到反馈后才将此消息从队列中删除。
如果一个消费者在处理消息出现了网络不稳定、服务器异常等现象,那么就不会有ACK反馈,RabbitMQ会认为这个消息没有正常消费,会将消息重新放入队列中。
如果在集群的情况下,RabbitMQ会立即将这个消息推送给这个在线的其他消费者。这种机制保证了在消费者服务端故障的时候,不丢失任何消息和任务。
消息永远不会从RabbitMQ中删除,只有当消费者正确发送ACK反馈,RabbitMQ确认收到后,消息才会从RabbitMQ服务器的数据中删除。

ACK机制的开发注意事项

如果忘记了ACK,那么后果很严重。当Consumer退出时候,Message会一直重新分发。然后RabbitMQ会占用越来越多的内容,由于RabbitMQ会长时间运行,因此这个"内存泄漏"是致命的。

代码演示

spring:
  #rabbit 配置信息
  rabbitmq:
    #发布者确认
    publisher-confirms: true
    #启动消息失败返回,此接口是在交换器路由不到队列时触发回调
    publisher-returns: true
    template:
      #启用强制信息;默认false
      mandatory: true
    listener:
      simple:
        #设置消费端手动 ack   none不确认  auto自动确认  manual手动确认
        acknowledge-mode: manual
        #是否启动时自动启动容器
        auto-startup: true
        #指定一个请求能处理多少个消息,如果有事务的话,必须大于等于transaction数量.
        prefetch: 10
        #决定被拒绝的消息是否重新入队;默认是true(与参数acknowledge-mode有关系) 
        default-requeue-rejected: false
        retry:
          #监听重试是否可用
          enabled: true

消费者消费消息,打印输出后面手动抛出运行时异常,观察现象。

/**
 * @author KimWu
 * @Description :
 */
@Slf4j
@Component
@RabbitListener(
        //绑定队列
        bindings = @QueueBinding(
                //需要指定queue的名字
                value = @Queue(
                        //配置队列名称
                        value = "${rabbitmq.tenant.menu.name}",
                        //是否是一个可删除的临时队列 --> 消息持久化
                        autoDelete = "false"
                ),
                //配置交换器
                exchange = @Exchange(
                        //指定交换器名称
                        value = "${rabbitmq.tenant.menu.exchange}",
                        //指定具体的交换器类型,有常量类指定
                        type = ExchangeTypes.DIRECT
                ),
                //路由键
                key = "${rabbitmq.tenant.menu.routingkey}"
        )
)
public class TenantMenuListen {

    @Resource
    private AuthSysMenuService authSysMenuService;


    /**
     * 接受消息的方法,采用消息队列监听机制
     */
    @RabbitHandler
    @GlobalTransactional(rollbackFor = Exception.class)
    public void pay(String msg, Message message, Channel channel) throws Exception {
        /**
         * 该方法目前主要是同步菜单
         */
        try {
 			if(1 = 1){
 				throw new RuntimeException();
 			}
            //消费者手动ack机制
            channel.basicAck(message.getMessageProperties().getDeliveryTag(), false);
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

观察现象,如下所示:

在RabbitMQ的浏览器界面,可以看到一条消息未被进行ACK的消息确认机制,这条消息被锁定Unacked,所以一直在控制台进行报错。

在这里插入图片描述
控制台效果如下所示**,一直进行消息的发送,因为消费方一直没有返回ACK确认,RabbitMQ认为消息未进行正常的消费,会将消息再次放入到队列中,再次让你消费,但是还是没有返回ACK确认,依次循环,形成了死循环。**

在这里插入图片描述

如何解决问题呢,如果消息发送的时候,程序出现异常,后果很严重的,会导致内存泄漏的,所以可以使用RabbitMQ的ack确认机制。开启重试,然后重试次数,默认为3次。这里设置为5次。

spring:
  #rabbit 配置信息
  rabbitmq:
    #发布者确认
    publisher-confirms: true
    #启动消息失败返回,此接口是在交换器路由不到队列时触发回调
    publisher-returns: true
    template:
      #启用强制信息;默认false
      mandatory: true
    listener:
      simple:
        #设置消费端手动 ack   none不确认  auto自动确认  manual手动确认
        acknowledge-mode: manual
        #是否启动时自动启动容器
        auto-startup: true
        #指定一个请求能处理多少个消息,如果有事务的话,必须大于等于transaction数量.
        prefetch: 10
        #决定被拒绝的消息是否重新入队;默认是true(与参数acknowledge-mode有关系) 
        default-requeue-rejected: false
        retry:
          #监听重试是否可用
          enabled: true
          # 重试次数
          max-attempts: 5

效果如下所示:

可以看到控制台尝试了5次以后就不再进行重试了。

在这里插入图片描述
RabbitMQ的界面可以看到,开始的效果和上面的一致,但是5次尝试以后,就变成了0条。RabbitMQ将这条消息丢弃了。

在这里插入图片描述
小结:
那么在进行ack的时候,一定要设置重试次数,不然容易造成内存泄漏问题

9-ACK消费者消息确认机制 待办 阅读详情

相关推荐

15.RabbitMQ 消费端手动ACK消息确认机制

  ack——acknowledge(vt. 承认;答谢;报偿;告知已收到;确认的意思),在RabbitMQ中指代的是消费者收到消息后确认的一种行为,关注点在于消费者能否实际接收到MQ发送的消息。   其提供了三种确认方式:   自动确认acknowledge=“none”:当消费者接收到消息的时候,就会自动给到RabbitMQ一个回执,告诉MQ我已经收到消息了,不在乎消费者接收到消息之后业务处理的成功与否。   手动确认acknowledge=“manual”:当消费者收到消息后,不会立刻告诉Rabbit

自能生羽翼,何必仰云梯 5538

RabbitMQ消息确认(发送确认,接收确认)

消息确认 每个 Consumer 可能需要一段时间才能处理完收到的数据。如果在这个过程中,Consumer 出错或异常退出,而数据还没有处理完成,那么这段数据就丢失了。因为我们采用 no-ack 的方式进行确认,也就是说,每次 Consumer 接到数据后,不管是否处理完成,RabbitMQ Server 会立即把这个 Message 标记为完成,然后从 Queue 中删除。 为了

很多时候犯错都是在不知情的情况下发生的 1万+

RabbitMQ消费端报:delivery acknowledgement on channel 5 timed out. Timeout value used: 1800000 ms. This t

【2】编辑 rabbitmq.conf 文件,如果没有此文件请创建名为 rabbitmq.conf 文件。【1】进入 rabbitmq 容器,cd 到 /etc/rabbitmq/ 目录。1、rabbitmq开启手动确认模式之后,但是在消费消息之后没有确认导致。2、在 rabbitmq 服务端的配置文件中,禁用或配置更长的超时时间。1、编辑 rabbitmq.conf 文件,在文件中添加如下内容。1、在消费端消费后,无论消费正常还是异常,都要ack确认。2、消息确认超时的间隔太短导致。

hkl_Forever的博客 5375

rabbitmq 故障判断

查看rabbitmq Dashboard 就能观察出整个集群的状态, ready 可以看成是消息积压,但是大多是由死信队列导致,这个大可放心,即便消息再多,虽然消费者不消费但是配置了TTL消息会自动删除。 Publish 数一般不要超过12000/s, 一般小集群高峰平均:1000/s 左右 大集群高峰平均:6000/s 左右 Disk write 与 Deliver(manual ack) 息息相关, 手动ack 在消费者没有消费消息的时候,为了保证数据不丢失,采用beta这种落地方案,只要物理节点I

屈帅波的技术博客 6472

IC版图设计布局经验90条!

13 如果一个cell调用其它cell,被调用的cell的vssx,vddx,vssb,vddb如果没有和外层cell连起来,要打上PIN,否则通不过diva检查.尽量在布局低层cell时就连起来。48 在匹配电路的mos管左右画上dummy,用poly,poly的尺寸与管子尺寸一样,dummy与相邻的第一个poly gate的间距等于poly gate之间的间距。8 更改cell时查看路径,一定要在正确的library下更改,以防copy过来的cell是在其他的library下,被改错。

weixin_44606964的博客 909

二、声明式 Pipeline 语法

选择型参数,一般用于给定几个可选的值,然后选择其中一个进行赋值,例如:parameters { choice(name: ‘CHOICES’, choices: [‘one’, ‘two’, ‘three’], description: ‘’) },表示定义一个名为 CHOICES 的变量,可选的值为 one、two、three;默认情况下,如果定义了某个 stage 的 agent,在进入该 stage 的 agent 后,该 stage 的 when条件才会被评估,但是可以通过一些选项更改此选项。

Cyan_Jiang的博客 1220

JAVA高级工程师--RabbitMQ消费者消息限流、超时、死信队列以及若依集成升级

在一开始介绍MQ的时候,就提到了削峰填谷,本质上就是限流,所以我们需要对限流做一个落地的实现。这一块,基于消费者做代码实现。并且基于手动ack的开启我配置了,但是并未生效。后面发现代码中硬编码了,其实那段RabbitMqConfig类中该方法messageListenerContainer是不需要的,在RabbitMqClient类中并未使用SimpleMessageListenerContainer那需要yml配置怎么生效的呢?在这个包中,

heni6560的博客 1189

基于STM32 FOC下桥三电阻采样方式的电机相电流重构方法

如何提高三电阻采样的调制率

wanrenqi的博客 9191

RabbitMQ高级特性实战:从基础到高可用,搞定消息丢失、延迟投递与故障排查

本文深入探讨RabbitMQ的高级特性,重点介绍如何构建高可靠的消息队列架构。主要内容包括:生产者可靠性(通过重连机制和确认机制确保消息投递)、MQ可靠性(数据持久化和LazyQueue解决消息丢失和堆积问题)、消费者可靠性(确认机制和失败处理策略)以及延迟消息实现方案(基于死信队列和延迟插件)。文章详细阐述了各机制的实现原理、配置方法和应用场景,帮助开发者在企业级应用中构建稳定、高效的消息系统。

A13549502743的博客 464

PointNet++改进策略目录

后续我将如何使用文章中创新点加入的PointNet++中代码实现部分进行更新。

u012901740的博客 2195

RK3568项目(四)--uboot启动流程之启动模式选择

本章接着上面,接着来分析uboot启动流程,设计vendor、按键、驱动模式的选择等

文艺小少年的博客 584

深度解析:消息队列如何保证消息可靠性传输的完整机制

不丢失:消息在整个传输过程中不会丢失不重复:消息不会被重复消费(幂等性)有序性:在需要顺序消费的场景下保证消息顺序消息队列的消息可靠性是一个系统工程,需要从生产者、消息队列本身、消费者三个层面综合考虑。通过合理配置持久化策略、确认机制、重试策略等技术手段,结合完善的监控告警体系,可以构建出高可靠的消息传输系统。在实际应用中,需要根据具体的业务场景、性能要求和可靠性需求,选择合适的技术方案和配置参数,在可靠性和性能之间找到最佳平衡点。RabbitMQ官方文档 - 可靠性指南。

qq_61302385的博客 697

2024年数字IC秋招-海康威视-数字逻辑设计工程师-笔试题

笔试题型:单选 + 多选笔试平台:百一测试(电脑监控)笔试时间:1h30minA. AW通道B. D通道C. B通道D. AR通道return x++;x = 5;y = Foo(x);

qq_42135020的博客 3199

使用IDEA开发RabbitMQ教程系列(七)消费端ACK和消费端拒绝

1、前言 在前面的章节中我们已经了解到生产者确认机制、Return机制,我们回顾一下我们之前在生产者确认机制中抛出的第三个问题:忘记的小伙伴可以回去看一下 RabbitMQ可靠性投递生产者确认机制 在接收者Receive Message(消息消费者) 在接收到消息后,如何通知消息投递者我已经接收到该消息?是否消费者也需要一个确认告知系统消费者已经接收到消息?答案是肯定的,就是今天我们要介绍的消费端...

Micro麦可乐的博客 1万+

《QGIS快速入门与应用基础》010:下载过程中常见问题(如网速慢、文件损坏)

针对QGIS下载过程中的常见问题提供了系统解决方案。主要解决下载速度慢(≤100KB/s)和文件损坏两大核心问题:通过切换国内镜像源(如清华大学、阿里云)、使用专业下载工具提升速度;采用MD5/SHA256校验确保文件完整性,并排查存储介质和杀毒软件干扰。文章还包含macOS权限问题、Linux依赖缺失等高频问题的速解方案,并附详细的排查流程图和预防技巧,帮助用户顺利完成QGIS下载。后续将详细介绍安装流程,适合零基础用户参考。

LuckyHanMo的博客 482

使用pyqt5实现可勾选的测试用例界面

使用pyqt5实现可勾选的测试用例界面

天赐好车的博客 629

RabbitMQ消息确认机制(ACK)

1、消息确认机制(ACK) 为了保证消息从队列可靠的达到消费者,RabbitMQ 提供了消息确认机制(Message Acknowledgement)。消费者在订阅队列时,可以指定 autoAck 参数,当 autoAck 参数等于 false 时,RabbitMQ 会等待消费者显式地回复确认信号后才从内存(或者磁盘)中移除消息(实际上是先打上删除标记,之后在删除)。当 autoAck 参数等于 true 时,RabbitMQ 会自动把发送出去的消息置为确认,然后从内存(或者磁盘)中删除,而不管消费者是否

pan_junbiao的博客 4万+

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

RabbitMQ消息可靠性保证机制3--消费端ACK机制

可以保证数据成功的发送到RabbitMQ,以及持久化机制,然尔这依然无法完全保证整个过程的可靠性,因为如果消息被消费过程中业务处理失败了,但是消息却已经被标记为消费了,如果又没有任何重度机制,那结果基本等于丢消息。由于消息被不断的重新放回队列,而消费者又只有当前这一个,所以,在不断拒收中被放回。从观察到的结果也印证了,反复的被推送,接收的一个过程中,使用命令查看队列的一个消费的情况。通过观察发现,消息已经没有在队列中了,那就是消息已经被丢弃了。在浏览器中访问,同样有66%的概率会被拒绝,仅33%会被确认。

bug_null的博客 1745

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

【三】rabbitmq消费者ACK机制message acknowledgment

一、队列关于ACK的设置 消费者在声明队列时,可以指定noAck参数,当noAck=false时,RabbitMQ会等待消费者显式发回ack信号后才从内存(和磁盘,如果是持久化消息的话)中移去消息。否则,RabbitMQ会在队列中消息被消费后立即删除它。 二、消费端关于ACK的设置 这个在channe.basicConsume方法中设置自动ACK还是手动ACK 1.自动 acknowledgement 模式 发后即忘 只要rabbitmq投递了消息给消费者,就认为投递成功,不管消费者是否真的收到

Sid小杰的博客 5374

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

RabbitMq的一些概念,持久化、队列排他、自动删除、消息确认机制、消息ACK、消费消息的模式

一、队列持久化的概念 队列的声明默认是存放到内存中的,如果rabbitmq重启会丢失,如果想重启之后还存在就要使队列持久化,保存到Erlang自带的Mnesia数据库中,当rabbitmq重启之后会读取该数据库。 二、排他 简单理解就是在连接关闭时是否会删除队列(无论队列中有没有消息) 三、自动删除 当队列中有消息时,无论是否排他,关闭连接都不会删除队列,此时消费者消费完消息后再断开消费者,队列会被自动删除。(这里如果有多个消费者消费同一个队列,则需要所有消费者都断开后才能自动删除) 四、消..

毅呀毅呀哟 7896

RabbitMQ 消费端 ACK 与重回队列机制

消费端的手工 ACK 和 NACK 消费端进行消费的时候,如果由于业务异常导致失败了,返回 NACK 达到最大重试次数,此时我们可以进行日志的记录,然后手动 ACK 回去,最后对这个记录进行补偿。 或者由于服务器宕机等严重问题,导致 ACK 和 NACK 都没有,那我们就需要手工进行 ACK 保障消费端消费成功,再通过补偿机制补偿。 消费端的重回队列 消费端的重回队列是为了对没有处理成功的消息,把...

weixin_33742618的博客 965

RabbitMQ--Return消息机制、消费端限流操作、消费端ACK(四)

目录 目录 Confirm消息机制 什么是confirm消息机制 Return 消息机制 什么是Return消息机制? 示例代码 Producer.java Consumer.java 消费端限流 什么是消费端限流? 消费端限流的配置 示例代码: Consumer.java MyConsumer.java Producer.java 消费端ACK与重回队...

EndTheme_Xin的博客 971

springboot整合RabbitMQ消费端手动ACK确认机制

ack——acknowledge(vt. 承认;答谢;报偿;告知已收到;确认的意思),在RabbitMQ中指代的是消费者收到消息后确认的一种行为,关注点在于消费者能否实际接收到MQ发送的消息。 其提供了三种确认方式: 自动确认acknowledge=“none”:当消费者接收到消息的时候,就会自动给到RabbitMQ一个回执,告诉MQ我已经收到消息了,不在乎消费者接收到消息之后业务处理的成功与否。 手动确认acknowledge=“manual”:当消费者收到消息后,不会立刻告诉RabbitMQ已经

可控的事情要谨慎,不可控的事情要乐观。 7066

RabbitMQ的消息确认ACK机制

1、什么是消息确认ACK。   答:如果在处理消息的过程中,消费者的服务器在处理消息的时候出现异常,那么可能这条正在处理的消息就没有完成消息消费,数据就会丢失。为了确保数据不会丢失,RabbitMQ支持消息确定-ACK。 2、ACK的消息确认机制。   答:ACK机制是消费者从RabbitMQ收到消息并处理完成后,反馈给RabbitMQ,RabbitMQ收到反馈后才将此消息从队列中...

HiterCoder 1382

RabbitMQ的ack和nack机制

当生产者的发送消息到exchange,并路由到对应的队列后,MQ主动push消息到channel,由应用线程从channel中获取消息。 主动ACK是指在MQ主动push到channel中后,channel立马自动的给到MQ ack响应,然后MQ删除消息。 MQ使用的问题点: 1、当消费者宕机的情况下,会导致消息丢失,因为MQ已经删除了对应的消息。 2、只要队列中存在消息,MQ就会全部推送给消费者的channel。如果数据量过大,存在拖垮消费者的风险。所以,一般使用MQ的时候选择使用手动ACK避免因消费者宕

weixin_44399827的博客 8442

RabbitMQ系列教程(十)ACK确认机制保障消费端消息的可靠性

概述 在实际项目中如果业务代码出现BUG,消费端进行消费的时候,我们可以记录错误日志,然后在消费端进行消息补偿。如果出现服务器宕机问题,那就需要手工ACK,然后在生产端进行消息补偿。生产端消息补偿可以使用RabbitMQ的confirm机制。 ACK机制与消费端消息补偿机制 把channel.basicConsume(...)方法的autoAck参数改为false channel.basi...

warybee 2121
上一篇: RabbitMQ(二)消息可靠投递
下一篇: RabbitMQ(四)重复消费/幂等性和有序性
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值