栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Java

RabbitMq设置ackMode = “AUTO“,并且手动ACK导致的错误

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

RabbitMq设置ackMode = “AUTO“,并且手动ACK导致的错误

背景:批量往相同的queue中推送消息(推送时间间隔几十毫秒)

代码编写:设置ackMode = "AUTO",并且手动ACK导致的错误

现象:生产者发送一条消息,可能消费者消费了多条消息(2,3条不等),也有正常消费一条的

参考链接:

rabbit PublisherCallbackChannel is closed问题跟踪 - 知乎

RabbitMQ-如何保证消息在99.99%的情况下不丢失【附源码】_mob604756f3c518_51CTO博客

解决方案:删除掉手动ack的代码

上代码:

交换机,路由,队列

 

生产者:

 消费者:

查询日志

正常现象

 异常现象(重复消费2条)

 排查问题思路:

1. 因为生产者是循环发送mq消息,可能发送多了,没有跳出循环,日志没有获取到?

2. 在rabbit manager 中往交换机中手动推送一条,是否能收到多条?

以上都通过测试后,一切正常,1.没有重复推送;2.发送一条,接收一条

再次在ELK中查询日志,查询消费者的接收的消息体,发现问题

1.正常消费的消息

 2. 异常消费的消息

 

 为什么redelivered会是true呢?谷歌一下

具体看参考链接,这里就不多解释了,并且需要看一下auto模式下怎么ack的?

 

看完之后就豁然开朗,应该是消费出现异常了

然后又去搜索异常消费的消息的错误日志,发现问题

 再回头看消费者代码,设置ackMode = "AUTO",并且手动ACK导致的错误导致;

看到这里屡一下执行流程:

1.A消息正常,完成后,自动ACK后,再次手动ACK,关闭了信道;

2.间隔几十个毫秒,B消息,redelivered = true,deliveryTag = 1 又回到了队列头部 redelivered = true,deliveryTag = 2,就消费了两次;

这里有两个疑问

1.信道关闭后,是如何又有了呢?

2. redelivered = true 为什么deliveryTag只递增到2,为啥没有3,4,5...什么时候结束的呢?

如果是收到了自动ACK了,deliveryTag = 2应该也不会有?

如果有知道的大佬,请留言,最好是附上链接

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/686358.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号