背景:批量往相同的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应该也不会有?
如果有知道的大佬,请留言,最好是附上链接