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

在RabbitMQ中,哪个更昂贵,每个交换机多个队列,还是每个交换机多个且队列更少?,rabbitmq,message,event-bus,broker,Rabbitmq,Message,Event Bus,Broker,因此,我们决定在向微服务体系结构的迁移中使用RabbitMQ作为消息/事件总线,但我们无法确定放置队列的最佳方式,我们有两种选择: 一个主交换是扇出交换,它反过来将消息扇出到一个主队列以用于日志记录和其他目的;另一个子交换是主题交换,并使用消息路由键将消息路由到每个所需队列。我们预计子交换机后面的队列数量将相当大。这可以通过以下图表来解释: 一个主交换,将是主题交换,仍然有一个主队列使用“#”路由键绑定到该交换。该主交换还将处理到其他子交换的主路由,因此路由键可能是“协议.#”,“分配.#”,

因此,我们决定在向微服务体系结构的迁移中使用RabbitMQ作为消息/事件总线,但我们无法确定放置队列的最佳方式,我们有两种选择:

  • 一个主交换是扇出交换,它反过来将消息扇出到一个主队列以用于日志记录和其他目的;另一个子交换是主题交换,并使用消息路由键将消息路由到每个所需队列。我们预计子交换机后面的队列数量将相当大。这可以通过以下图表来解释:

  • 一个主交换,将是主题交换,仍然有一个主队列使用“#”路由键绑定到该交换。该主交换还将处理到其他子交换的主路由,因此路由键可能是“协议.#”,“分配.#”,“消息.#”,然后用于绑定多个主题子交换,每个子交换将处理子路由,因此一个子交换可能处理所有“分配”绑定到该交换的队列可以通过路由键绑定,如“assignments.accepted”、“assignments.deleted”……在这种情况下,我们感觉每个交换的队列数量将减少,它们将以某种方式分布在交换之间。 那么,以下哪种情况可能是最好的方法?RabbitMQ速度更快,开销更少


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

    我将首先重新总结一下我认为是您的问题,因为我相信它会隐藏在您的帖子中

    除了用于实际消息处理的一系列特定于工作的队列之外,还需要一个跟踪程序/日志记录队列。哪种exchange拓扑最适合此场景

    首先,考虑到您的应用程序,这两个选项都没有多大意义。选项1将创建一个exchange,该exchange将向绑定到它的每个队列发布一条消息,而不管是什么。这显然不是你想要的。选项2将为您提供一个相当复杂的路由拓扑,其优点尚不清楚,缺点是痛苦的维护和陡峭的学习曲线。(你能做某事并不意味着你就应该做。)

    应该做什么?

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

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


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

    您可以在本主题中找到一些解释:

    我使用RabbitMQ的方式与您在案例2中展示的方式非常相似,因为我发现了与本文所述相同的好处:

    Exchange-to-Exchange绑定在您可以设计的拓扑结构方面更加灵活,可促进解耦并减少绑定波动

    据说Exchange到Exchange绑定非常轻量级,因此有助于提高性能*

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