RabbitMQ-每台机器需要通道吗?

时间:2019-05-30 02:36:11

标签: .net-core rabbitmq amqp

我们有多台后端计算机。目标是让每台机器拾取发送到单个RabbitMQ交换机的每条消息。

FooExchange设置为fanout(因此它将消息发送到与其连接的所有队列)。 FooExchange有一个队列FooQueue,绑定到该队列。我们所有的机器都是FooQueue的使用者。

这在本地工作正常,但是当我们有多台计算机在玩时,它出现,一次只能有一台计算机接收消息。它专门接收消息1次/无论有多少台机器。旧的答案here证实了这一点。

我有几个问题:

  1. 在每台计算机上创建队列是进行下一步的最佳方法吗?
  2. “机器”实际上将是K8S吊舱-在队列名称中,我应该使用什么作为唯一的机器标识符?还是只是实例化一个GUID并每天调用它?
  3. 最后,我该如何处理Pod重新启动(如果不熟悉K8S,请考虑使用云负载均衡器来启动新的VM实例)-当替换的Pod / VM创建新的Pod / VM来使用时,这将导致死队列。 li>

2 个答案:

答案 0 :(得分:1)

1)扇出交换机将所有消息路由到所有绑定的队列。因此,第一个问题的答案取决于您要实现的目标。如果希望每个使用者接收每个消息,请使用扇出交换,为每个消费者创建队列,并将其绑定到交换。让每个消费者专门使用其队列中的消息。

另一方面,如果您希望每条消息仅消耗一次,请使用一个队列,并让所有使用者使用其中的消息。这将使用默认的循环行为:消费者轮流使用,每条消息仅被消费一次。

2)如果使用第一种方法,则可以在创建队列时为每个使用者自动生成队列名称。此名称将是唯一的。

3) RabbitMQ支持temporary queues,当消费者离开时,它们会被删除。如果您要求每条消息至少消耗一次,请确保为离开的使用者无法使用的消息声明dead letter exchange。这将使您能够重新路由此类消息。

答案 1 :(得分:0)

无需在每台后端计算机上创建FooQueue。 RabbitMQ可以支持多个连接。您可以在每台后端计算机上启动RabbitMQ consumer。确保每个consumer打开一个新连接并从队列中使用。如果您希望消费者一次消费一条消息,请设置基本消息。