生产者和消费者没有脱钩

时间:2019-07-10 15:02:45

标签: rabbitmq

根据我对Rabbitmq和AMQP的阅读,大多数交换,队列和绑定都是由应用程序完成的,例如

App1(Producer) declares exchange1
App2(Consumer) declares queue1 and binds to exchange1

然后我看到为了不丢失消息,这两个消息都应声明其他配置,所以现在应该是:

App1(Producer) declares exchange1, declares queue1 and binds to exchange1
App2(Consumer) declares exchange1, declares queue1 and binds to exchange1

现在,生产者应用程序需要知道它从来不需要知道的细节。 这可以接受吗?感觉不对

1 个答案:

答案 0 :(得分:0)

为使消费者能够将交换绑定到他要从中消费消息的队列,该交换必须存在并且具有预期的类型(扇出,直接,主题)和配置。

考虑一种情况,即消费者将依赖于其他人创建的交换。如果他只是创建队列,然后尝试将其绑定到丢失的交换机,则将收到错误消息。

在必须经过特定配置的事物(交换,队列,绑定)的情况下,消费者才能执行其部分设置,您可以使用以下三种选择:

  1. 由第三方配置必需的东西,确保在生产者和消费者从应用程序代码运行之前完成这些事情。
  2. 配置生产者或消费者所需的东西,并确保首先运行应用程序代码的这一部分。
  3. 让生产者和消费者执行相同的步骤来配置所需的东西。这使得应用程序代码的不同部分的执行顺序无关紧要。

如果配置步骤在所有方面都相同,则第三个选项将起作用。例如,如果此配置始终相同,则RabbitMQ接受重复创建交换。如果以不同的配置再次配置了现有的交换机,则会引发错误。

我想说,对于应用程序代码进行设置的情况,建议使用第三个选项。对我来说感觉不错。