在 RabbitMQ 中哪个更贵,每个交换多个队列,还是多个交换和每个交换更少的队列?

Posted

技术标签:

【中文标题】在 RabbitMQ 中哪个更贵,每个交换多个队列,还是多个交换和每个交换更少的队列?【英文标题】:In RabbitMQ which is more expensive, multiple queues per exchange, or multiple exchanges and less queues per each? 【发布时间】:2017-10-08 14:59:01 【问题描述】:

所以我们决定在迁移到微服务架构时使用 RabbitMQ 作为消息/事件总线,但是我们无法找到关于放置队列的最佳方式的明确答案,我们有两种选择一起去:

    一个主交换器将是一个扇出交换器,它反过来会将消息扇出到一个主队列以进行日志记录和其他目的,另一个子交换器将是一个主题交换器并将消息路由到每个所需的队列使用消息路由键。我们预计子交易所后面的队列数量会很大。这可以用这张图来解释:

    一个主交换,它将是一个主题交换,仍然有一个主队列使用“#”路由键绑定到该交换。那个主交换也会处理到其他子交换的主路由,所以路由键可能是“agreements.#”、“assignments.#”、“messages.#”,然后用于绑定多个主题子交换,每个将处理子路由,因此一个子交换可能正在处理所有“分配”,并且绑定到该交换的队列可以由诸如“assignments.accepted”,“assignments.deleted”之类的路由键绑定......在这种情况下,我们觉得每个交易所的大量队列将减少,它们将以某种方式在交易所之间分配。 那么,这些场景中的哪一个可能是最好的方法?在 RabbitMQ 上更快,开销更少。

请注意,所有队列、交换和绑定都将在发布或订阅的服务中即时完成。

【问题讨论】:

【参考方案1】:

你可以在这个话题中找到一些解释:RabbitMQ Topic exchanges: 1 Exchange vs Many Exchanges

我使用 RabbitMQ 的方式与您在案例 2 中展示的方式非常相似,因为我发现了与本文所述相同的好处:https://skillachie.com/2014/06/27/rabbitmq-exchange-to-exchange-bindings-ampq/

交换到交换绑定在您可以设计的拓扑、促进解耦和减少绑定流失方面更加灵活

Exchange-to-exchange 绑定据说重量很轻,因此有助于提高性能 *

根据我自己在交换到交换方面的经验,案例 2 非常棒,它将允许以非常快速的方式创建/更改消息流拓扑。

【讨论】:

【参考方案2】:

我将首先重新总结一下我认为是您的问题,因为我确定它隐藏在您帖子的某个地方。

除了一系列用于实际消息处理的特定于工作的队列之外,还需要一个跟踪器/日志记录队列。哪种交换拓扑最适合这种情况?

首先,考虑到您的应用程序,这两个选项都没有多大意义。选项 1 将创建一个交换器,该交换器将向绑定到它的每个队列发布消息,无论如何。这显然不是你想要的。选项 2 将为您提供相当复杂的路由拓扑,其好处尚不清楚,缺点是维护痛苦且学习曲线陡峭。 (仅仅因为你可以做某事并不意味着你应该去做。)

应该怎么做?

重要的是要记住,在 RabbitMQ 中,消耗代理资源的是队列。交易所只是将队列与发布者连接起来。交换是达到目的的手段,而队列本身就是目的。

我认为你应该做的是建立一个单一主题交流。将您的跟踪队列绑定到路由键#,以便您接收所有消息。然后,适当地绑定您的工作队列,以便它们只接收需要流入它们的消息。例如,通常按消息类型路由消息,其中每个队列只保存一种类型的消息。这既简单又有效。

单一主题交换的优势在于您可以同时获得 Direct ExchangeFanout Exchange 的好处,具体取决于所使用的绑定密钥。此外,配置更改很容易实现,并且通常可以在不中断任何系统处理的情况下完成(假设您想要停止跟踪某些消息 - 这可以使用主题交换轻松完成,假设您的路由键是合理的) .

【讨论】:

以上是关于在 RabbitMQ 中哪个更贵,每个交换多个队列,还是多个交换和每个交换更少的队列?的主要内容,如果未能解决你的问题,请参考以下文章

RabbitMQ 概念

rabbitmq概念

python中消息队列RabbitMQ的使用

rabbitmq--路由模式

RabbitMQ发布订阅模式

PHP使用RabbitMQ