主题与RabbitMQ交换含糊不清

时间:2014-06-11 09:42:37

标签: php rabbitmq php-amqplib rabbitmq-exchange

我有点困惑。我试图实现主题交换,但不确定需要什么。

我想要几个路由键和一个主题交换(默认的amq.topic)。我的钥匙就像:

  • customer.appA.created
  • customer.appB.created
  • 顾客。*。创建

我希望我的队列能够耐用,但我需要1'客户' appA和appB的队列或2个队列? 我让我的出版商想通了; 连接,交换声明,基本发布

但我与消费者挣扎。让我们说我想打开3个控制台,每个控制台对应一个上述路由键 我当前的消费者有:连接,交换声明,队列绑定,基本消费。它们与耐用的客户相关联。队列。但是,我的消息正在循环到每个控制台/消费者,而不是使用路由密钥。

所以我的问题;

  1. 用于典型的主题交换设置;你需要多少个队列?
  2. 我的消费者可以只使用交换绑定,还是必须包含队列交互?
  3. 单个消息是否可能出现在2个主题交换的消费者中(或者您是否需要扇出)?

2 个答案:

答案 0 :(得分: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)?

是,仅当消费者拥有自己的(具有相同路由密钥的单独队列绑定)时。否则它将是循环方式。

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

答案 1 :(得分:1)

  

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

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

  

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

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

在将消息路由到与路由密钥相同的队列名称时,可能会对Default Exchange产生一些误解,有时会将其解释为发布到队列,但这不是真的。

  

单个消息是否可能出现在2个主题交换的消费者中(或者您是否需要扇出)?

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

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

让您使用三个不同的路由键customer.appA.createdcustomer.appB.created和`customer.appC.created。

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

您可以通过使用精确路由密钥(customer.appA.createdcustomer.appB.created等绑定队列来创建单独的队列来收集特定消息,或者如您所述,使用通配符路由密钥{{1绑定队列}}

要仅为appA和appB收集消息,您可以使用两个绑定customer.*.createdcustomer.appA.created创建队列,这样您就可以在一个队列中输入两个消息。