gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-05 02:21:12 26 4
gpt4 key购买 nike

我有一个包含一个生产者和多个消费者的环境。
生产者创建两种类型的消息:

  1. 只需要由一个消费者处理的消息(任何消费者都可以)。
  2. 需要由所有消费者处理的消息。

如何实现?
对于消息类型 1,工作队列是合适的模型。
对于消息类型 2,fanout/direct/routing/topic 是合适的。
但是我该如何组合它们呢?

最佳答案

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

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

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

根据以上理解,当队列数清楚时。剩下的就是如何将您的消息路由到这些队列。会有很多解决方案。以下只是一些示例。

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

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

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

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

一个交换器可以使用相同的绑定(bind)键绑定(bind)多个队列。因此,当使用发布路由键“type_1”发布消息类型 1 时,只有 shared_queue 会收到消息;当使用发布路由键 - “type_2” 发布消息类型 2 时,所有队列 1、队列 2... 都将收到消息。

如果您有更多消息类型并且不想使用相同的路由键,则对每条消息使用不同的绑定(bind)键可能不适合实际情况。如果是这样,您可能想改用“主题”交换类型:

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

关于RabbitMQ:如何结合任务队列和扇出/路由/主题模型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36112650/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com