RabbitMQ交换:默认与直接

RabbitMQ交换:默认与直接,rabbitmq,Rabbitmq,我有两种类型的消息希望通过RabbitMQ发送。因此,我有两个选择如何做到这一点: 向默认的空命名exchange发送了一条消息,其路由_键对应于队列名称 在队列绑定中使用与消费者的routing\u key参数相对应的directexchange的routing\u key参数 那么哪个选项更可取,为什么呢?默认的交换是直接交换。默认情况下,RabbitMQ创建默认交换,但它使用空字符串作为名称。如果查看默认Exchange下的: 默认交换是没有名称的直接交换(空字符串) 由经纪人预先声明

我有两种类型的消息希望通过RabbitMQ发送。因此,我有两个选择如何做到这一点:

  • 向默认的空命名exchange发送了一条消息,其
    路由_键
    对应于队列名称
  • 在队列绑定中使用与消费者的
    routing\u key
    参数相对应的
    direct
    exchange的
    routing\u key
    参数
那么哪个选项更可取,为什么呢?

默认的交换是直接交换。默认情况下,RabbitMQ创建默认交换,但它使用空字符串作为名称。如果查看默认Exchange下的:

默认交换是没有名称的直接交换(空字符串) 由经纪人预先声明

您也可以通过运行
rabbitmqctl list\u交换来查看这一点:

                direct
Foo             direct    < Same thing as the above
amq.direct      direct
amq.fanout      fanout
...and so on
直接
Foo direct<与上述内容相同
直接
扇出扇出
等等

就我所知,使用其中一个对另一个没有任何好处。如果您只需要基于路由密钥进行路由,我将坚持使用默认的exchange

假设您直接绑定到exchange广播日志,以路由“info”、“warn”和“error”键。使用默认的exchange,您需要使用这些名称创建三个不同的队列来接收所有日志;调整您收到的日志级别需要更改队列声明。通过使用命名交换,您可以简单地更改队列的绑定并继续正常处理


简言之,它提供了一个额外的抽象级别。

在我看来,默认的直接交换通过隐式使用队列名称将队列(由消费者使用)绑定到交换(由生产者使用),使消费者和生产者有可能互不了解

我将默认的直接交换用于一个特定的情况:消费者和生产者彼此不了解。在我的例子中,每个消费者都有其适当的队列。从生产者那里,我无法提前知道将声明和使用哪些队列,因为这取决于消费者。因此,不可能定义自定义直接交换和生产者端队列之间的绑定。 使用自定义(用户定义的)直接交换解决此问题的一种方法是在使用者端定义绑定键。但这意味着要从消费者的角度了解制作人,因为我需要知道制作人使用的交换名称

因此,在我的例子中,在默认的直接交换上,通过自动绑定队列的名称,可以只在使用者端声明队列,并且只知道队列的名称就可以从生产者向其发送消息


当然,这意味着在运行时调用生产者时要知道队列的名称,因为需要知道自定义直接交换的绑定密钥(在我的例子中,队列的名称由使用生产者的应用程序给出)。但在配置代理时,生产者和消费者不必相互了解。

rabbitmq web manager中的一些描述。
//默认exchange的绑定

  • 默认交换
默认交换隐式绑定到每个队列,
路由密钥等于队列名称

这是不可能的

  • 显式绑定到,或
  • 从默认交换中解除绑定
  • 它也不能被删除

说明@making3答案的另一种方法是,默认交换是一种直接交换,所有队列都隐式绑定到该交换,队列名称作为路由密钥。创建队列时,它将使用自己的名称绑定到默认exchange。