当前位置: 首页 > 知识库问答 >
问题:

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

秋兴思
2023-03-14

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

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

共有2个答案

朱欣荣
2023-03-14

我将首先重新总结我认为是你的问题,因为我肯定它埋在你的帖子的某个地方。

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

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

应该怎么做?

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

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

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

萧浩漫
2023-03-14

您可以在本主题中找到一些解释:RabbitMQ主题交易所:1交易所vs许多交易所

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

Exchange到Exchange绑定在您可以设计的拓扑方面更加灵活,促进了解耦

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

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

 类似资料:
  • 特别是我们设置队列管理器的名称。从这个模式来看,队列管理器名称似乎是完全标识队列管理器所必需的。人们可能会得出结论,在同一主机和端口上,不同的队列管理器可能会监听。这可能吗? 但是,当设置连接名称列表以指定重新连接目标时,不需要队列管理器名称: null 我们有两个队列管理器监听具有不同名称的不同主机/端口。我们希望使用这些队列管理器中的一个作为连接名称列表中的故障转移管理器。问题是:队列管理器是

  • 我试图使用BasicGet仅检索与通道的Exchange/Queue/RoutingKey组合匹配的消息。 我们的路由密钥的一个例子是 我遇到的问题是,路由密钥被完全忽略,所有消息无论指定的路由密钥是什么,都可以通过BasicGet获得。 我使用的是直接交换。我认为直接就足够了,我不需要通配符的能力,您可以通过主题交换获得路由键。 直接交换和路由密钥解决方案是否应该与BasicGet配合使用? 谢

  • 我有两个独立实例(p1、p2)的生产者应用程序和两个独立实例(c1、c2)的消费者应用程序。 生产者p1连接到exchange,主题为t1,队列名称为name1。 使用者c1连接到exchange,主题为t1,队列名称为name1。 生产者p2连接到exchange,主题为t2,队列名称为name1。 使用者c2连接到exchange,主题为t2,队列名称为name1。 我在RabbitMQ GU

  • 我目前正在尝试使用RabbitMQ(具有出色的RabbitMQBundle)来处理大量的异步工作。 目标是让一个队列发布相同类型的消息,并让多个服务器上的X个工作者在同一时间内查看消息。 每个工人都要偷看一条消息,完成工作,然后偷看另一条消息,等等。 这里是我的conf: 在我的consumer中,我有一个日志文件中的条目和120秒的睡眠。 我启动了php app/console rabbitmq

  • 我目前正在学习一些关于RabbitMQ+SpringAMQ的知识,我试图使我的SimpleMessageListenerContainer能够读取传递到我的两个队列的消息,但只有一个队列在接收消息。如果你有任何关于代码的进一步提示,或者如果有任何方法可以更好地做它,请让我知道这将是很好的。 编辑:问题是代码没有将消息发送给两个队列,只发送给一个队列。 基本上我是从两个队列接收的,一个在数据库中插入

  • 我在我的项目中使用RabbitMQ,我想知道是应该使用具有多个路由密钥的单个交换还是使用多个交换?哪个效率更高? 例如,如果我使用带有路由键A、B、C的单个exchange E,消费者连接到该exchange E,并使用A、B、C路由键获取数据。另一种选择是,我应该将其发送到exchange A、exchange B、exchange C,而不使用路由密钥,并且消费者可以连接到每个exchange