我有一个生产者和一些消费者的环境 制作人创建了两种类型的消息:
如何实施?
对于消息类型1,工作队列是合适的模型
对于消息类型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向您展示了如何创建和绑定交换。