为什么在RabbitMQ中需要使用路由键?

31
为什么我们需要路由键来将消息从交换机路由到队列?我们不能直接使用队列名称来路由消息吗?此外,在向多个队列发布时,我们可以使用多个队列名称。有没有人能指出实际上需要路由键而队列名称不足的情况?

2
路由键不是 AMQP 基本发布的可选项。因此,陈词滥调的答案是:“AMQP 要求它”。 - Raedwald
1
这就像问为什么我们不能在互联网上使用本地主机地址来托管我们的网站。当您测试使用RabbitMQ传递消息的某个应用程序时,需要使用路由键。并且环境是群集环境,其中交换包含其他应用程序。在那里,您无法使用Fanout Exchange(将同一消息发送到所有队列)或Topic Exchange(与绑定键匹配)。您有一个单一的发布者(测试发布者)和一个或两个订阅者(测试订阅者)。 - KumarAnkit
2个回答

22

交换机有几种类型。 fanout 交换机忽略路由键并将消息发送到所有队列。但几乎所有其他交换机类型都使用路由键确定消息将被发送到哪个(如果有的话)队列。

RabbitMQ 网站上的教程描述了不同交换机类型有用的几种用例以及路由键的相关性。

例如,教程 5演示了如何使用 topic 交换机根据每条消息的日志级别将日志消息路由到不同的队列。

如果您想要针对多个队列进行操作,则需要将它们绑定到一个 fanout 交换机并在发布者中使用该交换机。

无法在发布者中指定多个队列名称。在 AMQP 中,您不会将消息发布到队列,而是将其发布到交换机。交换机负责确定相关队列。有可能消息路由到任何一个队列都没有,直接丢弃。


1
好的。为什么我们需要在交换机和队列之间使用路由键?我们可以使用扇型交换机将消息发送到所有队列。同样,如果我们想要发送到特定的或多个队列,我们不能使用队列本身的名称吗?为什么我们需要特殊的“路由键”概念? - Naresh
您可以将队列名称放在路由键中,并发布到“默认交换机”(命名为空字符串的交换机):您的消息将最终进入您想要的队列。路由键和不同类型的交换机提供了更多的灵活性,使您可以更好地将消息路由到队列中。它还允许您进一步解耦发布者和消费者。另一个优点是,它将路由知识从发布者移动到总线中,这是应该属于总线的。 - Jean-Sébastien Pédron
RMQ网页界面可以让你发布到队列,所以我猜这是可能的,但很少使用。 - nurettin

8

将队列名称与应用程序解耦,有助于提高灵活性。

  • 你可以建立多个队列来消费同一条消息,但队列的名称不能相同。

  • 在某些情况下,消息的发起者并不知道队列的名称。 (例如,在水平扩展服务器时随机生成队列名称)

  • 一个交换机可能会路由多种类型的消费者的消息。 这时你需要在路由键中使用通配符以将消息路由到相关的消费者。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接