RabbitMQ系列(九)分布式RabbitMQ概述

1,609 阅读4分钟

概述

AMQP 0-9-1和AMQP 1.0以及RabbitMQ通过插件支持的其他消息协议是与生俱来就支持分布式的:应用程序几乎都是在远程主机中连接RabbitMQ。 构建分布式RabbitMQ通常是有必要的或者可取的。有三种方法可以做到这一点:
1)使用集群;
2)使用Federation插件;
3)使用Shovel插件。
本指南提供每种方法的概述。

注意:这三种方法并不是相互排斥的,可以结合使用:集群可以和Federation插件或者Shovel插件或者两种插件连接在一起。

集群

集群将多个机器连接在一起形成一个集群。节点间的通信对客户端是透明的。集群的设计假定网络连接是相当可靠的,并提供类似局域网般的延迟。

1)集群中的所有节点必须运行相互兼容的RabbitMQ和Erlang版本;
2)节点通过使用由自动化部署工具安装的预先共享密钥(Erlang Cookie)进行相互之间认证;

集群中的所有节点之间自动复制虚拟主机、交换机、用户和权限。队列可以位于单个节点上,也可以跨多个节点进行镜像。
连接到集群中的任何节点的客户端都可以使用集群中的所有非排他队列,即使它们不在那个节点上。

Federation插件

Federation插件允许一个消息代理的交换机或者队列接收来自于发布到另一个消息代理上的交换或队列的消息,其中消息代理可以是单独的机器,也可以是集群。通信是通过AMQP(带有可选的SSL)进行的,因此必须为两个交换器或队列授予适当的用户和权限才能进行联合。

1)联合交换机通过点对点链路进行连接。默认情况下,消息将仅在联合链接上转发一次,但可以增加此功能(通过更复杂的联合交换机)以支持更复杂的路由拓扑。有些消息可能无法透过链路传送;如果消息到达联合交换器后没有被路由到队列,那么它首先就不会被转发;
2)联合队列也类似的通过点对点链路进行连接。消息将在联合队列之间移动任意次数,以跟踪使用者;

通常,您将使用Federation来链接互联网上的消息代理,以进行发布/订阅消息传递和工作排队。

Shovel插件

通过Shovel插件连接到消息代理和使用Federation插件类似。然而,Shovel工作在更底层。

Federation插件的目的是提供交换器和队列的自定义分发;而Shovel插件简单地从一个消息代理上消费消息并将它们转发到另一个消息代理的交换机。

通常,当您需要Federation插件提供更多的控制时,您可以使用Shovel插件连接到网络上的消息代理。动态Shovel插件在以特定的方式移动消息是很有用的。

总结

Federation/Shovel插件 Clustering
消息代理在逻辑上是独立的,可能有不同的所有者。 一个集群形成单一的逻辑消息代理。
消息代理可以运行不同版本的RabbitMQ和Erlang。 所有节点必须运行兼容的RabbitMQ和Erlang版本。
可以使用广域网连接消息代理。通信通过AMQP 0-9-1进行(可选TLS,需要设置适当的用户和权限)。 代理必须通过合理可靠的局域网链接进行连接。节点将使用共享的秘密进行身份验证,并可选地使用启用了TLS的链接。
消息代理可以按照您安排的任何拓扑进行连接。链接可以是单向的,也可以是双向的。 所有节点在两个方向上连接到所有其他节点。
从CAP定理出发,强调了可用性和分区容忍性(AP)。 从CAP定理出发,强调一致性和分区容忍性(CP)。
消息代理中的一些交换可能是联合的,而一些可能是本地的。 集群是要么都是联合,要么都不是
接到任何消息代理的客户端只能使用该代理中的非独占队列。 连接到任何节点的客户端都可以在所有节点上使用非排他队列。

上一篇:RabbitMQ系列(八)RabbitMQ的日志
下一篇:RabbitMQ系列(十)分布式RabbitMQ(集群)