RabbitMQ的主题交换歧义


Topic exchange ambiguity with RabbitMQ

我有点糊涂了。我正在努力实现主题交流,不确定需要什么。

我想有几个路由密钥和一个主题交换(默认的amq.topic)。我的键是这样的:

  • customer.appA.created
  • customer.appB.created
  • 客户。*共创

我希望我的队列是持久的,但是我需要1个"客户"队列还是2个appA和appB队列?我找到了我的出版商;连接,交换声明,基本发布

但是我在和消费者打交道。假设我想打开3个控制台,每个控制台对应前面提到的路由键。
我目前的消费者有:连接,交换声明,队列绑定,基本消费。这些连接到一个持久的"客户"队列。然而,我的消息正在被轮询到每个控制台/消费者,而不是使用路由密钥。

我的问题;

  1. 为典型的主题交换设置;您需要排几个队?
  2. 我的消费者是否可以只使用交换绑定,还是必须包含队列交互?
  3. 一条消息是否可能出现在2个具有主题交换的消费者中(或者您需要fanout)?

首先:Exchange不交付给Consumer。它将消息传递给Queue以匹配路由密钥。

      1. For a typical topic exchange set up; how many queues do you need?

如果你有多个消费者,那么你将需要为每个消费者创建一个队列。

      2. Can my consumers get away with just exchange binding, or does it have to include queue interaction?

你需要将consumer与queue绑定,如果queue不存在,则创建并绑定。

      3. Is it possible for a single message to appear in 2 consumers with topic exchange (or do you need fanout for that)?

YES,只有当消费者有自己的(使用相同路由键的单独队列绑定)。否则将采用轮循方式。

所以最好的方法是有消费者自己的队列和所需的路由密钥…!!

对于一个典型的话题交换设置;您需要排几个队?

这取决于您的应用程序需要。您可以从一个队列开始实现简单的FIFO堆栈,然后添加更多的队列,用于更多的粒状消息消费。

我的消费者是否可以只使用交换绑定,还是必须包含队列交互?

AMQP交换的思想是获取已发布的消息并将它们放入一个或多个队列(甚至其他交换或在某些条件下完全丢弃)。消费者只能使用队列,而发布者只能使用交换。

Default Exchange在将消息路由到与路由键相同的队列名称时可能会有一些误解,并且有时会被解释为发布到队列,这是不正确的。

一条消息是否可能出现在2个具有主题交换的消费者中(或者您需要fanout)?

我猜你是在谈论将一个消息复制到多个队列(虽然有一些错误的情况,当你真的可能有一个消息被多个消费者处理)。

如果是——当然。您可以为队列创建多个绑定来获取不同的消息。下面是一个小例子:

让您使用三个不同的路由密钥customer.appA.created, customer.appB.created和' customer. apppc .created.

将三条消息发布到主题交换。

您可以创建单独的队列来收集特定的消息,通过绑定队列与确切的路由键- customer.appA.created, customer.appB.created等,或者正如您已经注意到的,绑定队列与通配符路由键customer.*.created

要仅为appA和appB收集消息,您可以创建具有两个绑定customer.appA.createdcustomer.appB.created的队列,因此您将在一个队列中获得两个消息类型。