我对RabbitMQ中的路由密钥和绑定密钥有一点疑问。 我所理解的是,生产者使用“路由密钥”向交换机发送消息。 队列通过绑定密钥绑定到交换机。 在默认交换的情况下,我遇到了一个定义,如 - “每个队列都使用与队列名称相同的路由密钥自动绑定到默认Exchange。”
所以这里应该是“绑定密钥”而不是路由密钥?或者条款几乎相同?
每个队列都绑定到默认交换,绑定密钥等于队列名称,在内部就是这种情况 -
channel.queueBind(queueName, "", queueName);
这是对的吗?每个队列都绑定到默认交换,绑定密钥与队列名称相同。由于默认交换只是一个没有名称的直接交换,它将使路由密钥与队列的绑定密钥匹配,并在它们相等时路由它。我的理解是否正确?两个术语“绑定密钥”和“路由密钥”使用起来很容易混淆。
答案 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完成。