在RabbitMQ中,多个队列每个交换机更昂贵,还是多个交换机每个较少的队列更昂贵?

27
在我们迁移到微服务架构时,我们决定使用RabbitMQ作为消息/事件总线,但我们找不到一个明确的答案来确定放置队列的最佳方式,我们有两个选择:
1. 一个主要的交换机,它将是一个扇出交换机,其将消息扇出到主队列以进行日志记录和其他用途,另一个子交换机将是一个主题交换机,并使用消息路由键将消息路由到每个所需的队列中。我们预期在子交换机后面的队列数量会比较大。这可以通过此图表解释: First Option 2. 一个主要的交换机,它将是一个主题交换机,仍然有一个主队列使用“#”路由键绑定到该交换机。该主交换机也将处理其他子交换机的主要路由,因此路由键可能是“agreements.#”,“assignments.#”,“messages.#”,然后用于绑定多个主题子交换机,每个子交换机将处理子路由,因此一个子交换机可能处理所有“assignments”,而与该交换机绑定的队列可以通过类似“assignments.accepted”,“assignments.deleted”等路由键进行绑定。在这种情况下,我们感觉队列的数量会更少,它们会在交换机之间分布。 enter image description here 因此,这些方案中哪一个可能是最佳方法?在RabbitMQ上更快,开销更小。需要注意的是,所有队列、交换机和绑定都将在发布或订阅的服务中即时完成。
3个回答

4
您可以在这个主题中找到一些解释:RabbitMQ 主题交换:1个交换机 vs 多个交换机 我正在以与您在案例2中展示的非常相似的方式使用 RabbitMQ,因为我发现了这篇文章中描述的同样的好处:https://skillachie.com/2014/06/27/rabbitmq-exchange-to-exchange-bindings-ampq/ 交换机到交换机的绑定在拓扑结构方面更加灵活,促进解耦并减少绑定开销。
据说交换机到交换机的绑定非常轻量级,在提高性能方面有所帮助*。
基于我的交换机到交换机的经验,案例2非常棒,它将允许您非常快速地创建/更改消息流拓扑结构。

1

首先,我会重新总结一下我认为你的问题是什么,因为我相信它在你的帖子中被埋没了。

除了一系列特定于工作的队列用于实际消息处理之外,拥有一个跟踪器/日志队列是可取的。对于这种情况,哪种交换机拓扑结构最好?

首先,鉴于你的应用程序,两个选项都不太合理。选项1将创建一个交换机,该交换机将向所有绑定到它的队列发布消息,而不管其是否适用。这显然不是你想要的。选项2将为你提供一个相当复杂的路由拓扑结构,其好处不明确,缺点是痛苦的维护和陡峭的学习曲线。(仅仅因为你可以做某事,并不意味着你应该这样做。)

那么应该怎么做呢?

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

我认为你应该设置一个单一的主题交换,将你的跟踪队列绑定到路由键“#”,以便接收所有消息。然后,适当地绑定你的工作队列,使它们只接收需要流入它们的消息。例如,通常按消息类型路由消息,其中每个队列仅包含一种类型的消息。这既简单又有效。
单一主题交换的优点是,根据使用的绑定键,您可以获得直接交换和扇出交换的优点。此外,配置更改很容易实现,通常可以在不干扰任何系统处理的情况下完成(假设您想停止跟踪某些消息-使用主题交换可以轻松完成,假设您的路由键是合理的)。

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接