服务器定义的交换与用户定义的交换

时间:2014-01-24 12:56:27

标签: rabbitmq

在RabbitMQ中创建自己的交换有什么好处吗?

E.g。使用“amq.direct”与type = direct的“my_direct_exchange”。

1 个答案:

答案 0 :(得分:6)

短:

是的,它们可让您自由地提供代表性名称,设置额外选项并在需要时隔离消息流。

长:

默认amq.*每种类型的可用交换机+1直接无名称作为发布使用的默认值,由每个vhost中的代理预先声明,AMQP Specification 1.6. Class exchange

如果您没有特殊需求(请参阅下面的说明)并且每个项目都有单独的vhost(或者您知道自己在做什么),预定义和用户之间没有区别定义一个,至少在RabbitMQ实现中。

amq.*交换的好处是它们始终是预先定义的,因此您通常不需要在发布之前先创建它们。

注意,如果他们拥有足够的权限,您的应用仍然可以删除预先定义的交易。

此外,amq.*实体的目标是内部使用,尤其是队列(您甚至无法声明以amq.开头的实体),因此使用amq.*个不同于预定义的交换(来自用户应用程序的amq.rabbitmq.{trace,log})可能根本不是一个好主意。

使用amq.*次交换时的特殊情况

某些插件使用amq.*次交换,inc。默认的。例如,STOMP plugin使用amq.topic,RabbitMQ本身使用amq.rabbitmq.log进行日志记录,Firehose Traces使用amq.rabbitmq.trace。可能有另一个使用默认交换的插件,inc。所有权。与它们使用相同的交换可能会导致意外的结果,如消息流交集。

另外,请记住,默认情况下预定义的交换是持久的,并且具有可能与您真正需要的不同的默认属性和标志。

此外,请记住,RabbitMQ定义amq.matchamq.headers同时使用headers类型,因此为了实现经纪人之间的兼容性,您无法依赖在amq.match交换中,从摇篮中定义。

当你为AMQP客户端编写一些测试时,你也可以使用预先声明的交换(你可能别无选择)。

正如你所看到的,如果你的需要通过以上所有,那么是的,你可以使用它们,但我可以建议这不是最好的做法。