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