我有两种类型的消息,我想通过RabbitMQ发送。因此,我有两个选择,我可以这样做:
routing_key的默认空名exchange。direct exchange的routing_key参数与使用者的routing_key参数相对应那么哪一种选择更可取,为什么呢?
发布于 2013-12-11 19:15:38
默认交换是直接交换。默认情况下,RabbitMQ会创建默认的交换,但是它使用一个空字符串作为名称。如果您查看RabbitMQ AMQP概念页面,在“默认Exchange”下:
默认交换是由代理预先声明的没有名称(空字符串)的直接交换。
通过运行rabbitmqctl list_exchanges也可以看到这一点:
direct
Foo direct < Same thing as the above
amq.direct direct
amq.fanout fanout
...and so on据我所知,使用一个比另一个没有任何好处。如果您只需要根据路由密钥进行路由,我将坚持默认的exchange。
发布于 2014-12-15 17:40:19
假设您直接绑定到一个交换广播日志到路由键"info“、”警告“和"error”。使用默认exchange,您将需要创建三个具有这些名称的不同队列来接收所有日志;以及调整您接收到的日志级别将需要更改队列声明。通过使用指定的exchange,您可以简单地更改队列的绑定并继续正常处理。
简而言之,它提供了一个额外的抽象级别。
发布于 2015-08-08 19:56:12
在我看来,默认的直接交换为使用者和生产者提供了不了解对方的可能性,方法是使用队列的名称隐式地将队列(由使用者使用)绑定到exchange (由生产者使用)。
我对特定情况使用默认的直接交换:消费者和生产者不知道对方的情况。在我的例子中,每个消费者都有其适当的队列。从生产者那里,我无法预先知道哪些队列将被声明和使用,因为它取决于消费者。因此,不可能定义自定义直接交换和生产者端队列之间的绑定。使用自定义(用户定义的)直接交换来解决它的一种方法是在使用者端定义绑定键。但这意味着从消费者方面了解生产者,因为我需要知道生产者使用的交换名称。
因此,在默认的直接交换中,根据队列的名称自动绑定队列,在我的示例中,只需要知道队列的名称,就可以在使用者端声明队列,并从生产者那里发送消息。
当然,它意味着在调用生产者时在运行时知道队列的名称,因为它需要知道自定义直接交换的绑定键(在我的例子中,队列的名称是由应用程序使用生产者提供的)。但是在配置代理时,生产者和消费者并不需要相互了解。
https://stackoverflow.com/questions/14480052
复制相似问题