因此,我们决定在迁移到微服务架构的过程中使用RabbitMQ作为消息/事件总线,但我们无法找到放置队列的最佳方式的确切答案,我们有两种选择:
1.一个主交换将是扇出交换,它又将消息扇出到主队列,用于日志记录和其他目的,另一个子交换将是主题交换,并使用消息路由关键字将消息路由到每个所需的队列。我们预计子交换后面的队列数会很大。这可以通过下图来解释:
1.一个主交换,这将是一个主题交换,还有一个主队列使用“#”路由关键字绑定到该交换。该主交换还将处理到其他子交换的主路由,因此路由关键字可能是“协议.#"、“分配.#"、“消息.#",然后用于绑定多个主题子交换,每个主题子交换将处理子路由,因此,一个子交换机可能正在处理所有的“分配”,并且绑定到该交换机的队列可以由诸如“Assignment.Accepted”、“Assignment.Deleted”之类的路由关键字来绑定......在这种情况下,我们感觉每个交换机的大量队列将更少,它们将以某种方式分布在交换机之间。因此,以下哪种情况可能是最好的方法?2在RabbitMQ上运行速度更快,开销更少。
请记住,所有队列、交换和绑定都将从发布或订阅的服务动态完成。
3条答案
按热度按时间voj3qocg1#
您可以在此主题中找到一些解释:RabbitMQ Topic exchanges: 1 Exchange vs Many Exchanges
我使用RabbitMQ的方式与您在案例2中展示的方式非常相似,因为我发现了与本文中描述的相同的好处:https://skillachie.com/2014/06/27/rabbitmq-exchange-to-exchange-bindings-ampq/
交换到交换绑定在拓扑结构方面更加灵活,您可以设计拓扑结构,促进解耦并减少绑定变动
交换到交换绑定据说重量非常轻,因此有助于提高性能 *
根据我自己在交换到交换方面的经验,案例2非常好,它允许以非常快的方式创建/更改消息流拓扑。
2hh7jdfx2#
我首先要重新总结一下我认为是你的问题,因为我相信它埋在你的帖子的某个地方。
首先,对于您的应用程序,这两种选择都没有多大意义。选择1将创建一个交换,无论如何,该交换都将向绑定到它的每个队列发布消息。这显然不是您想要的。选择2将为您提供一个相当复杂的路由拓扑,其优点尚不清楚。缺点是维护起来很痛苦,学习曲线也很陡峭(你能做某事并不意味着你应该做)。
应该怎么做
在RabbitMQ中,是队列消耗了代理的资源,交换只是连接队列和发布者,交换是达到目的的手段,而队列本身就是目的。
相反,我认为您应该建立一个单个主题交换。将您的跟踪队列绑定到路由键
#
,以便接收所有消息。然后,适当地绑定您的工作队列,以便它们只接收需要流入它们的消息。例如,通常按消息类型路由消息。其中每个队列只保存一种类型的消息。这既简单又有效。单个主题交换的优势在于,根据所使用的绑定密钥,您可以同时获得 Direct Exchange 和 Fanout Exchange 的优势。此外,配置更改很容易实现,并且通常可以在根本不中断任何系统处理的情况下完成(假设您希望停止跟踪某些消息--这可以使用主题交换轻松完成,前提是您的路由键是合理的)。
vojdkbi03#
交换到交换绑定在语义上与交换到队列绑定相同。
https://www.rabbitmq.com/e2e.html