因此,我们决定在迁移到微服务体系结构中将RabbitMQ用作消息/事件总线,但是对于最佳的排队方式,我们找不到确切的答案,我们有两个选择:


一个主要的交换将是扇出交换,它将依次将消息散发到主队列以进行日志记录和其他用途;另一个子交换将是主题交换,并使用消息路由密钥将消息路由到每个所需的队列。我们期望子交换机后面的队列数量可以达到多少。可以通过以下图表对此进行说明:
rabbitmq - 在RabbitMQ中,哪个更昂贵,每个交换有多个队列,还是每个交换有多个交换且每个队列较少?-LMLPHP
一个主要的交换,将是一个主题交换,还有一个使用“#”路由键绑定到该交换的主要队列。该主交换机还将处理到其他子交换机的主路由,因此路由键可能是“ agreements。#”,“ assignments。#”,“ messages。#”,它们随后用于绑定多个主题子交换,每个子交换处理子路由,因此一个子交换可能正在处理所有“分配”,并且绑定到该交换的队列可能会被路由键(例如“ assignments.accepted”,“ assignments.deleted”)绑定...在这种情况下,我们觉得每个交换机的队列数量将减少,它们将以某种方式在交换机之间分配。
rabbitmq - 在RabbitMQ中,哪个更昂贵,每个交换有多个队列,还是每个交换有多个交换且每个队列较少?-LMLPHP
那么,这些方案中哪一个可能是最好的方法? RabbitMQ更快,开销更少。


请记住,所有队列,交换和绑定都将通过将要发布或订阅的服务即时完成。

最佳答案

我将首先总结一下我认为是您的问题,因为我敢肯定它已经埋在您的帖子中。

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

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

应该做什么?

重要的是要记住,在RabbitMQ中,队列消耗了代理的资源。交易所仅将队列与发布者连接。交换是达到终点的一种手段,而队列本身就是终点。

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

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

关于rabbitmq - 在RabbitMQ中,哪个更昂贵,每个交换有多个队列,还是每个交换有多个交换且每个队列较少?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43884379/

10-12 12:44
查看更多