【问题标题】:RabbitMQ: fanout from queue (not from exchange)RabbitMQ:来自队列的扇出(不是来自交换)
【发布时间】:2013-10-15 19:17:02
【问题描述】:

RabbitMQ 中是否有任何方法可以让多个消费者从同一个队列中获取相同的消息?

我需要将相同的消息发送给正在收听的任何人,但还要确保有人处理它。基本上,我需要交换的 fanout 功能和队列的 basic.ack 功能。有没有办法以可扩展的方式实现这一点?

【问题讨论】:

  • 使用扇出交换有什么问题?
  • 我希望消息的一份副本在被确认之前一直存在。我不希望它坐在多个队列中并可能在第一个 ack 之后持续存在。
  • 好的,正如 Abram 所说,有一个队列和多个消费者。所有消费者都必须看到消息。
  • 通过有损(蜂窝)网络同步连接。如果客户端断开连接,则不会发送消息,但所有连接的客户端都会收到相同的消息。老实说,这可能不是实现它的最佳架构,这就是我们继续前进的原因。

标签: rabbitmq message-queue amqp


【解决方案1】:

如果您试图确保消息得到正确处理,确认已提供此功能。如果您的消费者无法处理消息并且没有提供确认消息,它将被下一个可用的消费者重新排队并再次处理。在同一个队列中实现多个竞争消费者将为您提供循环交付,让其他消费者有成功的机会。

这将如何扩展取决于处理每条消息所需的时间与传入速率、队列持久性、预取以及队列中有多少竞争消费者。

【讨论】:

  • 这是行不通的,因为如果它被一个消费者承认,它就永远不会传递给它可能涉及的其他消费者。