何时使用RabbitMQ铲和联邦插件?

对于我工作的公司,我们希望使用RabbitMQ作为我们的主要消息总线。 我们的想法是每个应用程序都使用自己的虚拟主机进行内部通信,通过铲子或联邦插件,我们可以在多个虚拟主机之间共享某些types的事件(甚至可能是多台机器(非集群)) 。 我们select每个虚拟主机的应用程序来分隔公共事件的内部通信,并保持每个应用程序的安全性可调。

根据RabbitMQ网站上发布的信息,当我不得不select铲子或者必须select联邦插件时,我不明白。

RabbitMQ何时使用以下说明 :

通常情况下,如果您需要比联邦提供的更多控制权,则可以使用铲子将互联网中的经纪人链接起来。

当我select联邦时,我错过的铁锹的细粒控制是什么?

在这一刻,我想我更喜欢联邦插件,因为我可以通过联邦插件提供的REST API自动进行虚拟主机通信。 在铲子的情况下,我将需要改变铲子configuration,并重新启动RabbitMQ实例,每次我们想共享一个虚拟主机之间的事件。 我的想法是否正确?

我们目前正在Windows上运行RMQ,客户端从.NET连接。 在不久的将来,Java / Perl / PHP客户端将join。

总结我的问题:

  • 当我失踪的时候,我所错过的铁锹的细粒控制是什么?
    select联邦?
  • 使用铁锹时,更改虚拟主机间通信的唯一方法是更改​​configuration文件并重新启动实例吗?
  • 设置(每个应用程序的虚拟主机)是否有意义,或者我完全错过了这一点?

铲子和队列提供了不同的方法来从一个RabbitMQ节点转发消息到另一个。

联合交易所

通过联合交换,队列可以连接到上游(源)节点上的队列。 另外,下游(目标)节点上的交换将收到发布到上游节点的消息的副本。

联合交换与交换交换绑定类似,因为它们可以(可选地)订阅来自上游交换的有限的一组消息。

联合队列 (注意:这些是RabbitMQ 3.2.x中的新function)

使用联合队列,消费者可以连接到上游(源)和下游(目标)节点上的队列。

本质上,下游队列是上游队列中的消费者,期望将有附加的下游消费者以与附加到上游队列的消费者相同的方式处理消息。

下游(联合)队列使用的任何消息将不可用于上游队列上的使用者。

用例:

如果消费者正在从一个节点迁移到另一个节点,则联邦队列将允许发生这种情况,而不会丢失消息或处理两次。

用例: 来自RabbitMQ文档

典型的用途是将相同的“逻辑”队列分布在许多经纪人身上。 每个代理将声明与上游所有其他联合队列的联合队列。 (链接将在n个队列上形成一个完整的双向图。)

另一方面,铁锹将“上游”队列附加到“下游”交换。 (我将这些术语放在引号中,因为铁锹文档没有用与联合文档相同的语义描述节点。)

铁锹消耗队列中的消息并将其发送到目标节点上的交换机。 (注意:虽然通常不作为此模式的一部分进行讨论,但没有任何东西阻止消费者连接到源节点上的队列。)

回答具体问题:

当我select联邦时,我错过的铁锹的细粒控制是什么?

铁锹不必驻留在“上游”或“下游”节点上。 它可以从一个独立的节点进行configuration和操作。

铲子可以创build链接的所有元素:源队列,队列的绑定和目标交换。 因此,对于源节点或目的地节点是非侵入性的。

使用铁锹时,更改虚拟主机间通信的唯一方法是更改​​configuration文件并重新启动实例吗?

这通常是铲的公认的缺点。

使用以下命令(警告:仅在RabbitMQ 3.1.x上进行testing,并且只包含一个非常具体的rabbitmq.config文件),则可以从指定的文件重新加载铲斗configuration。 (在这种情况下是/etc/rabbitmq/rabbitmq.config

 rabbitmqctl eval 'application:stop(rabbitmq_shovel), {ok, [[{rabbit, _}|[{rabbitmq_shovel, [{shovels, Shovels}] }]]]} = file:consult("/etc/rabbitmq/rabbitmq.config"), application:set_env(rabbitmq_shovel, shovels, Shovels), application:start(rabbitmq_shovel).' 

设置(每个应用程序的虚拟主机)是否有意义,或者我完全错过了这一点?

这个决定将取决于你的用例。 虚拟主机主要提供队列/交换机和授权用户之间的逻辑(和访问)分离。

铲子就像一个devise良好的内置消费者。 它可以使用源代理和队列中的消息,并将其发布到目标代理和交换中。 你可以写一个应用程序来做到这一点,但铲已经是对的 – 如果你所需要的是将消息从队列中移动到同一个或另一个经纪人的交易所,铲可以为你做。 就像一个行为良好的应用程序一样,它可以声明交换/队列/绑定,重新连接,更改路由键等。您可以在源代码或目标代理上设置它,甚至可以使用第三个代理。 这基本上是一个AMQP客户端。

另一方面, 联邦则用于将您的经纪人连接到一个或多个上游经纪人,或者您甚至可以创build经纪人链,以任何您喜欢的方式来弯​​曲拓扑。 您可以联合交换或队列,例如将消息分发给多个代理,而无需将其他队列绑定到主题交换或使用扇出交换,并将消息从每个队列铲到下游代理。

回顾一下,联邦在更高层次上运作,而铲子大多是“正好”的写作良好的客户。

重新configuration铁锹,不幸的是,你必须重新启动经纪人。

我不认为你真的需要每个应用程序虚拟主机。 您可以将每个应用程序用户添加到代理,而无需单独的虚拟主机。 不过,不清楚“分享虚拟主机之间的事件”是什么意思。