rabbitmq federation 联邦交换机
rabbitmq的联邦交换机federation
一、为什么要使用联邦交互机federation
有些时候,我们的rabbitmq为了容灾,会部署到不同的城市。
例如北京部署一台rabbitmq,广州部署一台rabbitmq。
其中广州rabbitmq有exchangeA。
当北京的应用要发消息到exchangeA的时候,会因为网络原因,导致发送时间延时。
federation提供了一个能力,让北京的rabbitmq接受exchanegA的消息。然后再把exchangeA的消息转发到广州的exchangeA。
二、federation的原理
插件会在北京(broker1)上会建立一个同名的交换器exchangeA。
同时建立一个内部的交换器exchangeA broker3
,并通过路由键rkA
将这两个交换器绑定起来。
与此同时 Federation 插件还会在 brokerl 上建立一个队列federation: exchangeA.broker3
井与交换器exchangeA.broker3
进行绑定。
Federation插件会在队列federation: exchangeA.broker3
与 broker3中的交换器 exchangeA 之间建立一条 AMQP 连接来实时地消费队列federation: exchangeA.broker3
中的数据。
这些操作都是内部的,对外部业务客户端来说这条 Federation link 建立在brokerl exchangeA broker3 exchangeA之间
三、federation的使用
1、在两台虚拟机上面各安装1个rabbitmq实例
在机器1执行命令
docker run -d --hostname rabbit1 --net=host --name myrabbit1 rabbitmq:3.6.15-management
在机器3执行命令
docker run -d --hostname rabbit3 --net=host --name myrabbit3 rabbitmq:3.6.15-management
2、开启federation插件
在机器1执行命令进入容器
docker exec -it myrabbit1 /bin/bash
执行命令开启插件
rabbitmq-plugins enable rabbitmq_federation_management
在机器3执行命令进入容器
docker exec -it myrabbit3 /bin/bash
执行命令开启插件
rabbitmq-plugins enable rabbitmq_federation_management
访问ip:15672可以见到右边多了2拦
3、在机器3上面新建eujian.queue队列、eujian.exchange交换机、和他们之间的绑定。
这里使用命令行去新建(可以用管理后台自行新建)
rabbitmqctl eval 'rabbit_amqqueue:declare({resource, <<"/">>, queue, <<"eujian.queue">>}, true, false, [], none).'
rabbitmqctl eval 'rabbit_exchange:declare({resource, <<"/">>, exchange, <<"eujian.exchange">>}, fanout, true, false, false, []).'
rabbitmqctl eval 'rabbit_binding:add({binding, {resource, <<"/">>, exchange, <<"eujian.exchange">>}, <<"*">>, {resource, <<"/">>, queue, <<"eujian.queue">>}, []}).'
4、新增一个rabbitmq_federation
在机器3执行命令
rabbitmqctl set_parameter federation-upstream f1 '{"uri":"amqp://guest:guest@192.168.2.138:5672","ack-mode":"on-confirm"}'
这里的192.168.2.138改成机器1的ip
或者在管理台用页面新建
5、新增一个policy
这里是匹配以eujian.开头的交换机
在机器3执行命令
rabbitmqctl set_policy --apply-to exchanges p1 "eujian.*" '{"federation-upstream":"f1"}'
或者通过管理台新建
[图片上传中...(image.png-258e5f-1604834983968-0)]
6、效果验证
这里点击federation status
进入机器1的rabbitmq管理台
这里对机器1的exchange发送一条消息
然后在机器2的队列里面收到消息。