绑定密钥或路由密钥

时间:2018-05-24 06:20:38

标签: rabbitmq

我对RabbitMQ中的路由密钥和绑定密钥有一点疑问。 我所理解的是,生产者使用“路由密钥”向交换机发送消息。 队列通过绑定密钥绑定到交换机。 在默认交换的情况下,我遇到了一个定义,如 - “每个队列都使用与队列名称相同的路由密钥自动绑定到默认Exchange。”

所以这里应该是“绑定密钥”而不是路由密钥?或者条款几乎相同?

每个队列都绑定到默认交换,绑定密钥等于队列名称,在内部就是这种情况 -

channel.queueBind(queueName, "", queueName);

这是对的吗?每个队列都绑定到默认交换,绑定密钥与队列名称相同。由于默认交换只是一个没有名称的直接交换,它将使路由密钥与队列的绑定密钥匹配,并在它们相等时路由它。我的理解是否正确?两个术语“绑定密钥”和“路由密钥”使用起来很容易混淆。

2 个答案:

答案 0 :(得分:1)

简而言之:

  • 路由键位于消息上,
  • 绑定键位于路线(绑定)上,
  • 交易所将消息路由键与每个路由的绑定键进行比较,以确定是否应将消息发送到该路由上的队列。

这令人困惑,因为RabbitMQ文档和源代码在引用绑定键时都使用了两个术语

例如,您可以在名为IModel.queueBind()的{​​{1}}参数中指定绑定键:

routingKey

documentation中,它表示:

绑定可以使用额外的void QueueBind(string queue, string exchange, string routingKey, IDictionary<string, object> arguments); 参数。为了避免 与routingKey参数的混淆,我们将其称为 BasicPublish

因此,尽管它们确实是截然不同的,但由于它们之间的密切关系,有时在引用绑定键时会使用“路由键”

答案 1 :(得分:0)

绑定键与队列一起使用。这是在交换中注册队列的密钥。

路由键与消息一起使用。这是决定此消息应路由到哪个队列的关键。邮件可以具有其他类型的标识符用于路由,例如Topic Exchange中的匹配器。

  

每个队列都使用与队列名称相同的路由键自动绑定到默认交换机。

现在,路由键和绑定键不是相同的概念。 但是,在此情况下,对于默认交换,绑定密钥将与队列名称相同。因此,消息还将具有与队列名称相同的路由密钥。

所以

  

channel.queueBind(queueName,“”,queueName);

并非完全正确。但是,这取决于交换的类型,队列如何绑定到交换。在默认交换的情况下,它与队列名称绑定,因此将由RabbitMQ完成。