我有一个关于 RabbitMQ 中路由键与绑定键的问题。据我了解,生产者使用路由密钥向交易所发送消息。队列通过绑定键绑定到交换机。但是,我遇到了默认交换密钥的解释:
每个队列都会自动绑定到默认 Exchange,其路由键与队列名称相同。
该声明应该说“绑定密钥”而不是“路由密钥”吗?或者这些术语基本上是等价的?
对我来说,每个队列都绑定到默认交换器,绑定键等于队列名称,这意味着内部情况就是这样:
channel.queueBind(queueName, "", queueName);
这是正确的吗?每个队列都使用与队列名称相同的绑定键绑定到默认交换器。由于默认交换器只是一个没有名称的直接交换器,因此它会将路由键与队列的绑定键进行匹配,如果相等则路由它。我的理解正确吗? “绑定密钥”和“路由密钥”这两个术语的使用有点令人困惑。
简而言之:
这很令人困惑,因为 RabbitMQ 文档和源代码在引用绑定密钥时使用了这两个术语。
例如,名为
IModel.queueBind()
的 routingKey
参数是您指定绑定键的位置:
void QueueBind(string queue, string exchange, string routingKey, IDictionary<string, object> arguments);
在文档中,它说:
绑定可以采用额外的
参数。为了避免 与routingKey
参数混淆,我们将其称为BasicPublish
。binding key
因此,虽然它们确实不同,但由于它们的密切关系,有时在引用绑定键时会使用“路由键”。
路由密钥与消息一起使用。它是决定该消息应路由到哪个队列的关键。消息可以具有其他类型的路由标识符,例如 Topic Exchange 中的匹配器。
每个队列都会自动绑定到默认交换器,其路由键与队列名称相同。现在,routing-key 和 Binding-key 不是同一个概念。 但是,在默认交换的情况下,绑定键将与队列的名称相同。因此,消息也将具有与队列名称相同的路由键。
那么,
channel.queueBind(queueName, "",queueName);这并不完全是正确的做法。但是,这取决于交换器的类型以及队列如何绑定到交换器。在默认交换的情况下,它与队列名称绑定,因此将由 RabbitMQ 完成。