Rabbitmq队列的多个使用者是否可能获得相同的消息?

时间:2018-01-23 23:57:25

标签: go concurrency rabbitmq

我负责维护用Golang编写的生产软件,该软件使用RabbitMq作为其消息队列 请考虑以下情况:

  1. 许多goroutine正在发布到队列名称​​ logs

  2. 另一组goroutines从队列中读取并将消息写入MongoDB集合。

  3. 每个发布者或消费者分别拥有 Own 连接和自己的频道,他们正在无限循环中工作,永不消亡。 (程序启动时建立连接和通道。)
  4. autoAckexclusivenoWait都设置为false,prefetch设置为20,global设置为false 通道。 autoDeleteexclusive所有队列都是持久的 并且noWait都设置为false。
  5. 基本假设是队列中的每条消息都将传递给一个且只有一个消费者,因此每条消息都会在数据库中插入一次。
    问题是MongoDB集合中有重复的消息 我想知道是否有多个消费者获得相同的消息导致他们插入重复项?

1 个答案:

答案 0 :(得分:1)

我可以在您的设置中看到一个案例,其中消息将被多次处理,如果其中一个消费者在某个时刻出现问题。 情况将遵循这样的情况:

  1. 消费者从队列中获取大量消息
  2. 消费者开始处理消息
  3. Consumer将邮件提交给mongodb
  4. 由于rabbitmq频道/连接问题或其他类型的问题消费者方面,消费者从未确认消息
  5. 尚未确认的消息将在队列顶部重新排队
  6. 再次处理相同的邮件,导致重复
  7. 此类案例应在您的消费者日志中显示一些错误。