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

.net core RabbitMQ-每台机器需要通道吗?,.net-core,rabbitmq,amqp,.net Core,Rabbitmq,Amqp,我们有多台后端机器。目标是让每台机器接收发送到单个RabbitMQ交换的每条消息 FooExchange被设置为fanout(因此它向连接到它的所有队列发送消息)FooExchange有一个队列,FooQueue,它绑定到它。我们所有的机器都是FooQueue的消费者 这在本地运行良好,但当我们有多台机器在运行时,一次似乎只有一台机器接收消息。无论有多少台机器,它都会专门拾取消息1次。一个古老的答案证实了这一点 我有几个问题: 为每台机器创建队列是最好的继续方式吗 “机器”实际上是K8S吊舱-我

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

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

这在本地运行良好,但当我们有多台机器在运行时,一次似乎只有一台机器接收消息。无论有多少台机器,它都会专门拾取消息1次。一个古老的答案证实了这一点

我有几个问题:

  • 为每台机器创建队列是最好的继续方式吗
  • “机器”实际上是K8S吊舱-我应该在队列名称中使用什么作为唯一的机器标识符?或者只是实例化一个GUID并在一天内调用它
  • 最后,我如何处理pod重启(如果不熟悉K8S,请考虑云负载平衡器启动新的VM实例)——这将在替换pod/VM创建新实例时留下死队列

  • 不需要在每个后端计算机中创建
    FooQueue
    。RabbitMQ可以支持多个连接。您可以在每个后端计算机中启动
    RabbitMQ使用者
    。确保每个
    消费者
    打开一个新连接并从队列中消费。如果希望您的消费者一次使用一封邮件,请设置基本。

    1)扇出交换将所有邮件路由到所有绑定队列。因此,第一个问题的答案取决于你想要实现什么。如果希望每个消费者都能收到每条消息,请使用fantout exchange,为每个消费者创建一个队列,并将其绑定到exchange。允许每个使用者独占地使用其队列中的消息

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

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


    3)RabbitMQ支持,当使用者离开时,这些支持将被删除。如果您要求每封邮件至少消费一次,请确保为已离开的消费者无法消费的邮件声明。这将使您能够重新路由此类消息。

    我想您的意思是“队列”,而不是“频道”。是使用者在物理网络中使用的逻辑连接。这就是你要问的。对。我在第二节犯了个错误。更新了问题。这是如何设置的-只有一个VM拾取一条消息,然后将其从队列中删除。目标是让所有虚拟机接收消息。我最终将
    autoDelete
    设置为
    true
    。它应该在最后一个连接关闭后消除队列,这似乎支持了我的要求,即不要为宕机的VM用死队列填充兔子。