绑定密钥或路由密钥

问题描述 投票:0回答:3

我有一个关于 RabbitMQ 中路由键与绑定键的问题。据我了解,生产者使用路由密钥向交易所发送消息。队列通过绑定键绑定到交换机。但是,我遇到了默认交换密钥的解释:

每个队列都会自动绑定到默认 Exchange,其路由键与队列名称相同。

该声明应该说“绑定密钥”而不是“路由密钥”吗?或者这些术语基本上是等价的?

对我来说,每个队列都绑定到默认交换器,绑定键等于队列名称,这意味着内部情况就是这样:

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

这是正确的吗?每个队列都使用与队列名称相同的绑定键绑定到默认交换器。由于默认交换器只是一个没有名称的直接交换器,因此它会将路由键与队列的绑定键进行匹配,如果相等则路由它。我的理解正确吗? “绑定密钥”和“路由密钥”这两个术语的使用有点令人困惑。

rabbitmq
3个回答
13
投票

简而言之:

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

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

例如,名为

IModel.queueBind()
routingKey
参数是您指定绑定键的位置:

void QueueBind(string queue, string exchange, string routingKey, IDictionary<string, object> arguments);

文档中,它说:

绑定可以采用额外的

routingKey
参数。为了避免 与
BasicPublish
参数混淆,我们将其称为
binding key

因此,虽然它们确实不同,但由于它们的密切关系,有时在引用绑定键时会使用“路由键”。


9
投票
绑定密钥与队列一起使用。它是在交换器中注册队列的密钥。

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

每个队列都会自动绑定到默认交换器,其路由键与队列名称相同。

现在,routing-key 和 Binding-key 不是同一个概念。 但是,在默认交换的情况下,绑定键将与队列的名称相同。因此,消息也将具有与队列名称相同的路由键。

那么,

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

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


0
投票
我有一个密钥从我的交换机发送到队列,而侦听器正在同一交换机上侦听该密钥,但在不同的队列中,他仍然会收到通知。难道他不应该只在消息发送到他的队列时收到通知吗?

© www.soinside.com 2019 - 2024. All rights reserved.