我有两种想要通过 RabbitMQ 发送的消息。所以我有两个选择如何做到这一点:
routing_key
将消息发送到与队列名称对应的默认空名称交换- 在队列绑定中使用与消费者参数对应的
direct
交换参数routing_key
routing_key
那么哪个选项更可取,为什么?
我有两种想要通过 RabbitMQ 发送的消息。所以我有两个选择如何做到这一点:
routing_key
将消息发送到与队列名称对应的默认空名称交换direct
交换参数routing_key
routing_key
那么哪个选项更可取,为什么?
默认交换是直接交换。RabbitMQ 默认创建默认交换,但它使用空字符串作为名称。如果您查看RabbitMQ AMQP 概念页面,在 Default Exchange 下:
默认交换是代理预先声明的没有名称(空字符串)的直接交换。
您也可以通过运行看到这一点rabbitmqctl list_exchanges
:
direct
Foo direct < Same thing as the above
amq.direct direct
amq.fanout fanout
...and so on
据我所知,使用其中一个没有任何好处。如果您只需要基于路由键进行路由,我会坚持使用默认交换。
假设您直接绑定到交换广播日志到路由键“info”、“warn”和“error”。使用默认交换,您需要使用这些名称创建三个不同的队列来接收所有日志;并且调整您收到的日志级别将需要更改您的队列声明。通过使用命名交换,您可以简单地更改队列的绑定并继续正常处理事物。
简而言之,它提供了一个额外的抽象级别。
正如我所看到的,默认的直接交换通过使用队列的名称隐式地将队列(由消费者使用)绑定到交换(由生产者使用),使消费者和生产者有可能不知道彼此。
对于特定情况,我使用默认的直接交换:消费者和生产者彼此不了解。就我而言,每个消费者都有其适当的队列。从生产者那里,我无法提前知道要声明和使用哪些队列,因为这取决于消费者。因此,不可能定义自定义直接交换和生产者端的队列之间的绑定。使用自定义(用户定义的)直接交换解决它的一种方法是在消费者端定义绑定键。但这意味着从消费者方面了解生产者,因为我需要知道生产者使用的交换名称。
因此,在默认的直接交换中通过队列名称自动绑定队列,就我而言,可以只在消费者端声明一个队列,并通过只知道队列的名称从生产者向其发送消息。
当然,这意味着在调用生产者时在运行时知道队列的名称,因为它需要知道自定义直接交换的绑定键(在我的情况下,队列的名称由使用生产者的应用程序给出)。但是在配置代理时,生产者和消费者不必相互了解。
rabbitmq web manager中的一些描述。
//默认exchange的绑定
默认交换隐式绑定到每个队列,
路由键等于队列名称。
这是不可能的