RabbitMQ——Fedration插件
前言
Fedration插件用来在不同的RabbitMQ集群之间复制队列消息,集群可以是内网也可以是公网,而这些对应用来说是透明的,即应用不会感知到,也不需要编写相关代码。
应用场景:
- 集群间复制队列消息
- 集群升级
特点:
-
松耦合性(Loose coupling)
- federation 插件能够在分属不同管理域的 broker 或 cluster 之间传递消息:
- 他们可能设置了不同的 user 和 vhost ;
- 他们可能运行在不同版本的 RabbitMQ 和 Erlang 上;
-
WAN 友好性(WAN-friendly)
- federation 插件基于 AMQP 0-9-1 协议在不同 broker 之间进行通信,并设计成能够容忍不稳定的网络连通情况;
-
扩展性(Scalability)
- federation 不需要在 n 个 broker 之间建立 O(n^2) 个连接(尽管这是最简单的使用模式),这也就意味着 federation 在使用时更容易扩展
一、Fedration相关术语
1、Upstream(上游)、Downstream(下游)
上面有2个RabbitMQ集群,A和B,如果我们希望每次发到A的某个Exchange或队列的信息也发送到B,则A是Upstream,B是Upstream,
即数据流向是从Upstream流向Downstream的。不过Rabbit MQ里操作比较特殊,添加Upstream要在Downstream中加,而不是反过来在Upstream加Downstream。
2、Policy(策略)
即用来控制Fedration如何生效的,一个Fedration涉及到以下因素:
A、Upstream
因为是在Downstream中添加的,所以添加的时候需要指定Upstream的地址
B、应用到Exchange还是Queue(队列)
Fedration有几种类型,分别是应用到Exchange和Queue还是全部。
二、安装Fedration插件
首先是安装Erlang和RabbitMQ,这里不详述,注意两个版本对应上。
然后在Downstream(下游)集群启用插件:
rabbitmq-plugins enable rabbitmq_federation
rabbitmq-plugins enable rabbitmq_federation_management
注意:当你在一个cluster中使用federation插件,所有在集群中 的nodes都需要安装federation插件
三、创建Fedration
做实验之前,先规划下:
Upstream节点:172.21.107.236
Downstream节点:172.21.107.77
因为Fedration有分Exchange和Queue的,Queue就简单了,而Exchange分几种类型:Topic、Fanout、Direct。
为了方便实验我们只测试Topic类型的,Exchange和Queue的信息如下:
Exchange
Type:Topic
Name:oneplus_exchange
Routing Key:sms
Queue:
Name:sms
我们希望的结果是发送到236机器的oneplus_exchange这个Exchange的routing key为sms的消息都转发到77上,并且在236上不保存消息。
1、先添加Upstream
登录172.21.107.77后台:http://172.21.107.77:15672/#
点击Admin——Fedration Upstreams
添加界面如下:
Name根据命名规范自己定义,比较重要的参数如下:
URI:常用的格式:amqp://{用户名}:{密码}@{ip}
例子:amqp://guest:guest@172.21.107.236
Prefetch count:可以取多少条消息而不回复,和下面的Acknowledgement Mode配合使用,Acknowledgement Mode一般设为On Confirm,即确认才不重发。
Expires:代表缓存时间,如果说网络连通性不好的时候,消息会在上游的队列中缓存的时间,超时丢弃,设置为空则表示,永远缓存不会丢弃数据(但是如果长时候不恢复内存会占用越来越大,建议设置上)
Acknowledgement Mode: 代表消息确认方式,用来防止消息在传输过程中丢失,有三个值,on-confirm、on-publish、no-ack,对传输速度的影响是从慢速到快速,对安全性是不会丢失到可能会丢失。通常使用on-publish
,不然on-confirm
太慢了。
其它参数先默认就OK了。
2、在Downstream上添加policy
注意是在Downstream上添加,如果使用了镜像队列,好像有冲突。
重要的参数:
Pattern:匹配的正则,遵守左前缀匹配原则,如我想针对所有oneplus_exchange开头的这里就写oneplus_exchange
Apply to:应用到Exchange还是Queue还是两者都应用。我们实验是针对Exchange,所以只选Exchange。
federation-upstream:要应用到哪个Upstream上
3、在77上添加Exchange和Queue
Exchange:
Queue:
然后绑定Exchange和Queue:
4、在236上添加Exchange和Queue
添加之后有个灰的Exchange:
注意:Exchange不要绑定Queue
Queue也有个灰色的:
5、查看状态图
现在,刚才新建的 exchange 应该建立了 federation ,因为它都能匹配上面的 policy,可以通过页面查看状态
6、发送消息
执行之后到236(Upstream)上看:
再到77(Donwstream)上看:
四、总结
发送给Upstream:消息会复制给Downstream,如果Upstream也绑定了routing key,则Upstream也会保存1份消息。
发送给Downstream:消息只在Downstream上有,不会复制到Upstream。
即数据流向是单边的,只能从Upstream复制到Downstream,默认两边都会有1份,如果Upstream不想要则可以不绑定Queue。
引用: