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。

 

 

引用:

posted on 2021-05-17 22:40  曹伟雄  阅读(833)  评论(0编辑  收藏  举报

导航