我们有多台后端计算机。目标是让每台机器拾取发送到单个RabbitMQ交换机的每条消息。
FooExchange
设置为fanout
(因此它将消息发送到与其连接的所有队列)。 FooExchange
有一个队列FooQueue
,绑定到该队列。我们所有的机器都是FooQueue
的使用者。
这在本地工作正常,但是当我们有多台计算机在玩时,它出现,一次只能有一台计算机接收消息。它专门接收消息1次/无论有多少台机器。旧的答案here证实了这一点。
我有几个问题:
答案 0 :(得分:1)
1)扇出交换机将所有消息路由到所有绑定的队列。因此,第一个问题的答案取决于您要实现的目标。如果希望每个使用者接收每个消息,请使用扇出交换,为每个消费者创建队列,并将其绑定到交换。让每个消费者专门使用其队列中的消息。
另一方面,如果您希望每条消息仅消耗一次,请使用一个队列,并让所有使用者使用其中的消息。这将使用默认的循环行为:消费者轮流使用,每条消息仅被消费一次。
2)如果使用第一种方法,则可以在创建队列时为每个使用者自动生成队列名称。此名称将是唯一的。
3) RabbitMQ支持temporary queues,当消费者离开时,它们会被删除。如果您要求每条消息至少消耗一次,请确保为离开的使用者无法使用的消息声明dead letter exchange。这将使您能够重新路由此类消息。
答案 1 :(得分:0)
无需在每台后端计算机上创建FooQueue
。 RabbitMQ可以支持多个连接。您可以在每台后端计算机上启动RabbitMQ consumer
。确保每个consumer
打开一个新连接并从队列中使用。如果您希望消费者一次消费一条消息,请设置基本消息。