RabbitMQ:如何组合任务队列和扇出/路由/主题模型?

时间:2016-03-20 10:32:42

标签: rabbitmq

我有一个生产者和一些消费者的环境 制作人创建了两种类型的消息:

  1. 只有一个消费者需要处理的消息(任何消费者都会这样做)。
  2. 需要由所有消费者处理的消息。
  3. 如何实施?
    对于消息类型1,工作队列是合适的模型 对于消息类型2,扇出/直接/路由/主题是合适的 但是我该如何组合它们呢?

2 个答案:

答案 0 :(得分:3)

RabbitMQ非常灵活,您可以使用许多不同的交换和队列设计解决方案来满足您的需求。

但是,首先,我们需要了解队列和消费者之间的关系和基本规则:

  • 如果您希望消息类型仅由所有消费者中的一个使用,正如您所说,您需要一个工作队列,所有消费者都应该订阅它。
  • 如果您希望每个使用者都使用消息类型,则需要为每个使用者设置队列,并且每个使用者只订阅自己的队列。

根据上述理解,当队列数量明确时。剩下的就是如何将消息路由到这些队列。会有很多解决方案。以下是一些例子。

一个可行的解决方案是创建两个交换,每个消息类型一个。

| message type | exchange name | exchange type | bound queues      |
|------------------------------------------------------------------|
| type_1       | exchange1     | fanout        | shared_queue      |
| type_2       | exchange2     | fanout        | queue1,queue2,... |

另一个可行的解决方案是,如果您只想使用一个交换来发布这两种消息类型,请使用' direct'交换类型:

| routing_key | binding_key | bound queues      |
|-----------------------------------------------|
| type_1      | type_1      | shared_queue      |
| type_2      | type_2      | queue1,queue2,... |

一个交换可以使用相同的绑定密钥绑定多个队列。因此,当使用发布路由密钥发布消息类型1 - " type_1"时,只有shared_queue将接收消息;当使用发布路由密钥发布消息类型2 - " type_2"时,所有queue1,queue2,...都将收到消息。

如果您有更多的邮件类型且不想使用相同的路由密钥,则对于每种邮件使用不同的绑定密钥可能并不理想。如果是这样,您可能想要使用" topic"交换类型:

| routing_key | binding_key | bound queues      |
|-----------------------------------------------|
| type_1.1    | type_1.*    | shared_queue      |
| type_2.2    | type_2.*    | queue1,queue2,... |

答案 1 :(得分:0)

直接与扇出路由是RabbitMQ交换的属性。所有RabbitMQ消息都发布到交换,而不是直接发布到队列 - 当您创建和使用队列而不显式创建交换时,您实际上使用的是预先声明的默认交换。

您可以在单个RabbitMQ代理上创建多个交换,并且可以将单个队列绑定到多个交换。如果希望工作人员对两种消息类型使用相同的队列,则可以创建直接交换(对于消息类型1)和扇出交换(对于消息类型2),并将每个队列绑定到两个交换。否则,您可以为每种交换类型创建单独的队列。

RabbitMQ的AMQP concept guide对交换和队列有很好的解释,RabbitMQ Getting Started页面上的教程3向您展示了如何创建和绑定交换。