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

bin*_*bit 11 message rabbitmq broker event-bus

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

  1. 一个主要交换机将是Fanout交换机,它又将消息传递到主队列以进行日志记录和其他目的,另一个子交换机将是主题交换并使用消息路由键将消息路由到每个所需队列.我们期望子交换机后面的队列数量是多少.这可以用这个图解释: 第一选择

  2. 一个主交换,它将是一个主题交换,仍有一个主队列使用"#"路由密钥绑定到该交换.该主交换还将处理到其他子交换的主路由,因此路由密钥可能是"协议.#","赋值.#","消息.#",然后用于绑定多个主题子交换,每个都将处理子路由,因此一个子交换可能正在处理所有"赋值",绑定到该交换的队列可能被路由密钥绑定,如"assignments.accepted","assignments.deleted"......在这种情况下,我们感觉像每次交换的队列数量都会减少,它们会以某种方式在交换之间分配. 在此输入图像描述 那么,哪种方案可能是最好的方法呢?RabbitMQ更快,开销更少.

请记住,所有队列,交换和绑定都将从即将发布或订阅的服务中即时完成.

the*_*yer 1

我将首先重新总结我认为你的问题,因为我确信它隐藏在你的帖子中的某个地方。

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

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

应该做什么?

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

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

单个主题交换的优点是,根据所使用的绑定密钥,您可以获得直接交换扇出交换的好处。此外,配置更改很容易实现,并且通常可以在不中断任何系统处理的情况下完成(假设您想停止跟踪某些消息 - 假设您的路由键是合理的,这可以使用主题交换轻松完成) 。