参考资料:
https://www.rabbitmq.com/federation.html
Federation插件的设计目标是使RbbitMQ 在不同的 Broker 节点之间进行消息传递而无须建立集群,该功能在很多场景下都非常有用:
- Federation插件使RabbitMQ在不同Broker节点间进行消息传递而无须建立集群,在不同管理域(不同的用户和vhost、不同版本的RabbitMQ Erlang上)中的Broker或集群间传递消息。
- Federation插件基于AMQP 0-9-1协议在不同的Broker之间通信,能容忍不稳定的网络连接情况
- 一个Broker节点中可以同时存在联邦交换器(或队列)或者本地交换器(或队列),只需对特定交换器(或队列)创建Federation连接(Federation link)
- Federation插件可以让多个交换器或者多个队列进行联邦
- 一个联邦交换器federated exchange或者一个联邦队列federated queue接收上游upstream的消息,这里的上游指的是其他Broker上的交换器或者队列
- 联邦交换器能够将原本发送给上游交换器的消息路由到本地的某个队列中;联邦队列则允许本地消费者接收来自上游队列的消息
1、开启federation
2、配置federation,添加上游mq节点
(1)页面方式:
(2)命令行方式:
rabbitmqctl set_parameter federation-upstream my-upstream \
'{"uri":"amqp://server-name","expires":3600000}'
(3)Http方式:
PUT /api/parameters/federation-upstream/%2f/my-upstream
{"value":{"uri":"amqp://server-name","expires":3600000}}
3、添加策略,正则匹配exchange和queue
(1)页面添加
(2)命令行添加:
rabbitmqctl set_policy --apply-to exchanges federate-me "^amq\." '{"federation-upstream-set":"all"}'
(3)http接口调用添加:
PUT /api/policies/%2f/federate-me
{"pattern":"^amq\.", "definition":{"federation-upstream-set":"all"}, \
"apply-to":"exchanges"}
4、上下游节点不需要有同样的virtual host
(1)页面添加:
(2)命令行添加:
创建虚拟主机: rabbitmqctl add_vhost cloudMsgHost
5 、在下游节点添加queue和exchange, 会同步到上游节点
6、上游往匹配的队列中推送消息,下游节点会收到消息
以下demo为1个上游节点和两个下游节点
7、验证上游节点数
(1)下游单节点rabbitMQ
脚本中调用接口不停地添加上游节点,在不匹配queue或者exchange的情况下,可以添加1w+上游节点。在匹配5个queue的情况下,添加到3910个上游节点时mq容器就崩溃了。重启容器后,很多接口不响应,无法正常工作。
当上游数量在1500个左右时,性能还好,可以正常工作。
(2)下游为两节点镜像模式集群
当不停地增加上游节点,数量达到1500个左右时,rabbitMQ管理节点出现一段时间的报错,消息收发出现延迟。一两个小时后,恢复正常。之后再增加上游节点时,系统响应缓慢,很难再加上去了。
8、问题及注意事项:
- 密码中有“@”字符,会导致添加上游节点失败。