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

Go Rabbitmq队列的多个使用者是否可能获得相同的消息?,go,concurrency,rabbitmq,Go,Concurrency,Rabbitmq,我负责维护用Golang编写的生产软件,该软件使用RabbitMq作为其消息队列。 考虑以下情况: 许多goroutine正在发布到队列名称日志 另一组goroutines从队列中读取消息并将消息写入MongoDB集合 每个发布者或消费者都有自己的连接和各自的频道,它们在无限循环中工作,永不消亡。(连接和通道在程序启动时建立。) autoAck、exclusive和noWait都设置为false,prefetch设置为20,而global设置为false 频道。所有队列都使用自动删除,独占 和n

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

  • 许多goroutine正在发布到队列名称日志

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

  • 每个发布者或消费者都有自己的连接和各自的频道,它们在无限循环中工作,永不消亡。(连接和通道在程序启动时建立。)
  • autoAck
    exclusive
    noWait
    都设置为false,
    prefetch
    设置为20,而
    global
    设置为false 频道。所有队列都使用
    自动删除
    独占
    noWait
    都设置为false
  • 基本假设是队列中的每一条消息都将传递给一个且仅传递给一个使用者,因此每一条消息将恰好插入数据库一次。
    问题是MongoDB集合中存在重复消息。

    我想知道是否有可能多个消费者收到相同的消息,导致他们插入重复的消息

    我在您的设置中看到的一种情况是,如果某个消费者在某个时候出现问题,则会多次处理消息。 这种情况将发生在这样一种情况下:

  • 消费者从队列中获取一组消息
  • 消费者开始处理消息
  • 使用者将消息提交到mongodb
  • 由于rabbitmq通道/连接问题或其他类型的问题使用者端,使用者从不确认消息
  • 尚未确认的消息将在队列顶部重新排队
  • 再次处理相同的消息,导致重复

  • 这种情况应该会在您的用户日志中显示一些错误。

    我不确定rabbitmq设置与什么相关,但从根本上说,您不能有“恰好一次”在分布式系统中传递。因此,这里的要点是RabbitMQ不会发送相同的消息两次,除非您的消费者通知RabbitMQ失败,否则RabbitMQ将根据您的配置再次发送该消息。无论如何,通过使用消息代理,每个消费者都必须准备好接收相同的消息两次。好的,提取,
    使用确认保证至少一次传递。如果没有确认,在发布和使用操作期间可能会丢失消息,并且最多只能保证一次传递。
    我不同意@deFreitas语句。你做事的方式,加上你想要达到的目标和你能忍受的,将决定你是否至少有一次,最多有一次,或者两者都没有。现在我同意的是,实际上大多数设置至少会针对一次