【问题标题】:Rabbit Mq, Starting consumer before publisherRabbitmq,在发布者之前重启消费者
【发布时间】:2019-08-28 04:25:13
【问题描述】:

我为发布者和消费者创建了两个独立的应用程序,它们从公共队列发送和接收消息。我首先启动了消费者应用程序,但尚未声明交换(已声明并绑定到发布者上的队列),这就是我收到错误的原因。

所以我的问题是,

  1. 声明交换器并将其绑定到消费者队列是个好主意吗?
  2. 如果在消费者中声明交换,消费者应该知道交换属性和交换类型。在我的例子中,消费者只知道从特定队列接收消息的交换、队列、路由。

【问题讨论】:

    标签: c# .net-core rabbitmq


    【解决方案1】:

    首先重要的是要注意,即使队列未绑定到任何交换,启动消费者并从现有队列消费也不应该给您任何错误。队列不必绑定到交换器,它可以独立存在。

    回答您的问题:这取决于您的用例。消费者可以创建队列,创建交换器,然后将队列绑定到交换器。这允许消费者控制哪些消息被路由到队列并且可以被他消费。如果消费者是应该执行这个控制的一方,这很好。但是,如果用例指示除消费者以外的另一方应控制路由,则该另一方应创建交换和绑定。

    考虑一个只有简单交换绑定到队列的拓扑。在这样的拓扑中,只有从交换到队列的绑定,但没有从交换到交换的绑定。这样的拓扑可以由消费者创建。

    但请考虑具有两级交换的不同拓扑。下层的交换绑定到队列,这类似于第一个拓扑。但是在这个较低级别之上还有一个更高级别的交易所,它只绑定到较低级别的交易所。更高级别的交换基于与具体消费者无关的规则分发消息。事实上,这两个级别的交换可以在没有任何队列和消费者的情况下存在。消费者无法在此拓扑中创建交换和绑定。

    消费者可以通过为自己声明一个队列,将该队列绑定到他感兴趣的较低级别的交换器,并从队列中消费,从而成为第二个拓扑的一部分。消费者不会创建任何交换,他只会将他的队列绑定到它们。

    所以总结一下:在琐碎的场景中,谁声明交换、队列和绑定并不重要,只要一切都按正确的顺序完成。但在更复杂的场景中,责任应该分散在 RabbitMQ 管理员、生产者和消费者之间。

    【讨论】: