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

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




· 全网最简单!3分钟用满血DeepSeek R1开发一款AI智能客服,零代码轻松接入微信、公众号、小程
· .NET 10 首个预览版发布,跨平台开发与性能全面提升
· 《HelloGitHub》第 107 期
· 全程使用 AI 从 0 到 1 写了个小工具
· 从文本到图像:SSE 如何助力 AI 内容实时呈现?(Typescript篇)
2019-03-18 Centos7安装MySQL8.0 - 操作手册
2018-03-18 zookeeper安装教程(zookeeper3.4.5为例)