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

时间:2017-05-10 05:43:09

标签: rabbitmq message event-bus broker

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

  1. 一个主要的交换机,它将是一个扇出交换机,它反过来将消息传递到主队列以进行日志记录和其他目的,另一个子交换机将作为主题交换并将消息路由到每个所需的队列使用消息路由密钥。我们期望子交换机后面的队列数量是多少。这可以用这个图解释: First Option

  2. 一个主交换,它将是一个主题交换,仍有一个主队列绑定到该交换使用"#"路由密钥。该主交换机还将处理到其他子交换机的主路由,因此路由密钥可能是"协议。#","分配。#","消息。#& #34;,然后用于绑定多个主题子交换,每个子交换将处理子路由,因此一个子交换可能正在处理所有"赋值"绑定到该交换的队列可以通过路由键绑定,例如" assignments.accepted"," assignments.deleted" ...在这种情况下,我们觉得大量的队列将会每次交换时,它们会以某种方式在交易所之间分配。 enter image description here 那么,哪种方案可能是最好的方法呢? RabbitMQ速度更快,开销更少。

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

2 个答案:

答案 0 :(得分:0)

我将首先重新总结一下我认为你的问题,因为我确定它已经埋藏在你职位的某个地方。

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

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

该怎么做?

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

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

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

答案 1 :(得分:0)

您可以在此主题中找到一些解释:RabbitMQ Topic exchanges: 1 Exchange vs Many Exchanges

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

  

Exchange-to-exchange绑定在可以设计的拓扑方面更加灵活,可以促进去耦并减少绑定流失

     

据说交换交换绑定的重量很轻,因此有助于提高性能*

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

相关问题