我负责维护用Golang编写的 生产环境 软件,该软件使用RabbitMq作为其消息队列 .
考虑以下情况:
-
许多goroutine正在发布到队列名称日志 .
-
另一组goroutines从队列中读取并将消息写入MongoDB集合 .
-
每个发布者或消费者分别拥有自己的连接和自己的通道,他们正在无限循环中工作,永不死亡 . (程序启动时 Build 连接和通道 . )
-
autoAck
,exclusive
和noWait
都设置为false,prefetch
设置为20,所有通道的global
设置为false . 所有队列都是持久的,autoDelete
,exclusive
和noWait
都设置为false .
基本假设是队列中的每条消息都将传递给一个且只有一个消费者,因此每条消息只会在数据库中插入一次 .
问题是MongoDB集合中有重复的消息 .
我想知道是否有多个消费者获得相同的消息导致他们插入重复项?
1 回答
我可以通过您的设置看到一个案例,其中消息将被多次处理,如果其中一个消费者在某个时刻出现问题 . 情况将遵循这样的情况:
Consumer从队列中获取大量消息
Consumer开始处理消息
Consumer将消息提交给mongodb
由于rabbitmq Channels /连接问题,或其他类型的问题消费者方面,消费者从未确认消息
尚未确认的消息将在队列顶部重新排队
再次处理相同的消息,导致重复
这种情况应该在您的消费者日志中显示一些错误 .