2

我有点困惑。我正在尝试实施主题交换,但不确定需要什么。

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

  • customer.appA.created
  • customer.appB.created
  • 客户.*.created

我希望我的队列是持久的,但我需要 1 个“客户”队列还是 appA 和 appB 的 2 个队列?我已经弄清楚了我的出版商;连接,交换声明,基本发布

但我正在与消费者斗争。假设我要打开 3 个控制台,每个控制台对应上述路由键。
我当前的消费者有:连接、交换声明、队列绑定、基本消费。这些连接到一个持久的“客户”队列。但是,我的消息被轮询到每个控制台/消费者,而不是使用路由键。

所以我的问题;

  1. 对于典型的主题交换设置;你需要多少个队列?
  2. 我的消费者可以只使用交换绑定,还是必须包括队列交互?
  3. 一条消息是否可以通过主题交换出现在 2 个消费者中(或者您是否需要为此进行扇出)?
4

2 回答 2

2

第一件事:交换不交付给消费者。它将消息传递到 Queue 以匹配路由 kyes。

      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?

您需要将消费者与队列绑定,如果队列不存在则创建并绑定。

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

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

所以最好的方法是让消费者拥有自己的队列和所需的路由键......!!!

于 2014-06-11T09:54:38.573 回答
1

对于典型的主题交换设置;你需要多少个队列?

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

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

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

默认 Exchange 可能存在一些误解,因为它将消息路由到与路由键相同的队列名称,并且有时将其解释为发布到不正确的队列。

一条消息是否可以通过主题交换出现在 2 个消费者中(或者您是否需要为此进行扇出)?

我猜您是在谈论将一条消息复制到多个队列(虽然在某些错误情况下,您确实可能有多个消费者正在处理一条消息)。

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

让您使用三个不同的路由键和`customer.appC.created 将三个消息发布到主题customer.appA.created交换customer.appB.created

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

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

于 2014-06-12T08:48:23.483 回答