我想通过RabbitMQ发送两种类型的消息。所以我有两个选择我该怎么做:
routing_key
的默认空命名交换发送了一条消息
direct
参数对应的routing_key
交换routing_key
参数那么哪个选项更可取?为什么?
答案 0 :(得分:5)
默认交换是直接交换。 RabbitMQ默认创建默认交换,但它使用空字符串作为名称。如果您在默认交易所下查看RabbitMQ AMQP concepts page:
默认交换是没有名称的直接交换(空字符串) 由经纪人预先宣布。
您也可以通过运行rabbitmqctl list_exchanges
来看到这一点:
direct
Foo direct < Same thing as the above
amq.direct direct
amq.fanout fanout
...and so on
据我所知,使用一个优于另一个没有任何好处。如果您只需要基于路由键进行路由,我会坚持使用默认交换。
答案 1 :(得分:2)
假设您将交换广播日志直接绑定到“info”,“warn”和“error”的路由键。使用默认交换,您需要创建三个不同的队列,并使用这些名称来接收所有日志;并调整您收到的日志级别将需要更改您的队列声明。通过使用命名交换,您可以简单地更改队列的绑定并继续正常处理。
简而言之,它提供了一个额外的抽象级别。
答案 2 :(得分:0)
正如我所看到的,默认的直接交换通过将队列(由消费者使用)绑定到交换机(由生产者使用)隐式使用,可以让消费者和生产者不了解彼此。队列的名字。
我对特定情况使用默认直接交换:消费者和生产者彼此不了解。就我而言,每个消费者都有自己的队列。从生产者那里,我无法预先知道哪些队列将被宣布和使用,因为它取决于消费者。因此,无法定义自定义直接交换与生产者端队列之间的绑定。 使用自定义(用户定义)直接交换来解决它的一种方法是在消费者端定义绑定密钥。但这意味着要了解消费者方面的生产者,因为我需要知道生产者使用的交换名称。
因此,在我的情况下,在默认的直接交换中通过其名称自动绑定队列使得在消费者端只能声明一个队列并通过只知道队列来从生产者发送消息就成为可能。名称。
当然,它意味着在调用生产者时知道运行时队列的名称,因为需要知道自定义直接交换的绑定密钥(在我的例子中,队列&#39) ; s名称由使用生产者的应用程序给出)。但是在配置代理时,生产者和消费者不必相互了解。
答案 3 :(得分:0)
Rabbitmq Web管理器中的一些描述。
//默认交换的绑定
默认交换隐式绑定到每个队列,
路由键等于队列名称。
不可能