【问题标题】:Why do we need routing key in RabbitMQ?为什么我们需要 RabbitMQ 中的路由键?
【发布时间】:2016-07-18 01:45:47
【问题描述】:

为什么我们需要路由键来将消息从交换机路由到队列?我们不能简单地使用队列名称来路由消息吗?此外,在发布到多个队列的情况下,我们可以使用多个队列名称。谁能指出我们实际上需要路由键和队列名称还不够的情况?

【问题讨论】:

  • 路由键对于 AMQP basic.publish 不是可选的。所以老生常谈的答案是“AMQP 需要它”。
  • 这类似于问为什么我们不能使用本地主机地址来托管互联网上的网站。当您测试一些使用 RabbitMQ 传递消息的应用程序时,需要路由密钥。该环境是一个集群环境,其中 exchange 也包含其他应用程序。在那里您不能使用 Fanout Exchange(用于向所有队列发送相同的消息)或 Topic Exchange(与绑定键匹配。)您有一个发布者(测试发布者)和一个或 2 个订阅者(测试订阅者) .

标签: rabbitmq rabbitmq-exchange rabbitmqctl


【解决方案1】:

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

tutorials on the RabbitMQ website 描述了几个不同的交换类型有用的用例以及路由密钥相关的用例。

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

如果您想定位多个队列,您需要将它们绑定到 fanout 交换并在您的发布者中使用该交换。

您不能在发布者中指定多个队列名称。在 AMQP 中,您不会将消息发布到队列,而是将消息发布到交换。确定相关队列是交易所的责任。一条消息可能根本没有路由到任何队列,只是被丢弃了。

【讨论】:

  • 好的。为什么我们需要在交换和队列之间使用路由键。我们可以使用扇出交换将消息发送到所有队列。同样,如果我们要发送到特定或多个队列。我们不能使用队列本身的名称吗?为什么我们需要特殊的“路由键”概念
  • 您可以将队列名称放在路由键中并发布到 "" 默认交换器(以空字符串命名的 echange):您的消息将最终出现在您想要的队列中。路由键和不同类型的交换为您将消息路由到队列的方式提供了更大的灵活性。它还允许您进一步分离发布者和消费者。还有一个优势:它将路由知识从发布者转移到它所属的总线。
  • RMQ web 界面可以让你发布到队列,所以我想这是可能的,但很少使用。
【解决方案2】:

将队列名称与应用程序分离有助于提高灵活性。

  • 您可以建立多个队列来消费相同的消息,但队列不能具有相同的名称。

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

  • 交换可能会为不止一种类型的消费者路由消息。然后,您需要在路由键中使用一些通配符来将消息路由到相关的消费者。

【讨论】:

    猜你喜欢
    • 2011-07-05
    • 1970-01-01
    • 2014-05-29
    • 2016-07-27
    • 2019-06-09
    • 2016-10-17
    • 1970-01-01
    • 2019-03-10
    • 1970-01-01
    相关资源
    最近更新 更多