RabbitMQ Federation
Federation (联合) 常常用于 RabbitMQ 集群升级时做集群间消息同步以及负载均衡等场景。本文记录了 Federation 在 WebUI 配置方法以及本地简单坐下效果测试。
插件安装
通过以下命令开启 federation 插件,以及在 web 管理终端配置联合队列
rabbitmq-plugins enable rabbitmq_federation
rabbitmq-plugins enable rabbitmq_federation_management
队列配置
开启插件后在管理终端 admin
tab页下就可以看到相关的配置项了。通过界面上指定要做联合的队列的具体信息,就可以指定要联合的队列信息了。
本地测试
测试环境搭建
下面通过本地搭建测试环境来观察下联合队列的效果。
首先在 mac 上安装 RabbitMQ,具体安装方法见官方文档。这里至少需要两台 RabbitMQ,第二台采用 docker 方式建立。
docker环境搭建
首先拉取带管理终端的 docker 镜像
docker pull rabbitmq:management
启动 docker 容器,映射容器内部15672端口到本地的45672端口来访问,同时开放映射 docker 的5672端口到本地的18888端口以便做联合时指定URI
docker run -d --hostname my-rabbit -p 45672:15672 -p 18888:5672 --name test-rabbit rabbitmq:management
启动之后访问 localhost:45672 就可以访问 docker 上 RabbitMQ 的管理终端了。
建立联合
访问本地的管理终端(localhost:15672),将本地的 celery 队列联合到 docker 上的 celery 队列。
建立 upstream
首先需要通过 upstream 指定要联合的队列所在的 RabbitMQ 的地址和访问信息。
建立 policy
要想联合队列生效,还要建立 policy。通过 policy 指定策略生效的范围。
完成之后通过
Federation Status
查看生效情况。
启动消费者
启动消费者连接到本地的 RabbitMQ 上,可以发现被联合的上游队列也出现了该消费者,虽然 docker 内的 RabbitMQ 上实际并没连接消费者。
通过 docker 内的 RabbitMQ 投递消息,最终会被连接本地 RabbitMQ 的消费者收取,从而达到了联合的目的~
需要注意的是,如果消费者连接到被联合的队列上即 docker 内的队列时,消费者不会同步到两个 RabbitMQ 上。