rabbitmq 集群docker玩法
属于一个简单测试玩的,rabbitmq 实际最近几年变化还是挺大的(主要是一些新特性,核心amqp 是一致的)
环境准备
测试一个基于raft 选举的rabbitmq 集群队列
- docker-compose
version: "3"
services:
mq:
build: ./
container_name: rabbitmq
environment:
- RABBITMQ_DEFAULT_USER=admin
- RABBITMQ_DEFAULT_PASS=admin
- RABBITMQ_NODENAME=rabbitmq
hostname: rabbitmq
ports:
- "5672:5672"
- "15672:15672"
- "25672:25672"
- "14369:4369"
- "5671:5671"
depends_on:
- mqv2
mqv2:
build: ./
container_name: rabbitmqv2
hostname: rabbitmqv2
environment:
- RABBITMQ_DEFAULT_USER=admin
- RABBITMQ_DEFAULT_PASS=admin
- RABBITMQ_NODENAME=rabbitmqv2
ports:
- "5673:5672"
- "15673:15672"
- "25673:25672"
- "14370:4369"
- "5674:5671"
mqv3:
build: ./
container_name: rabbitmqv3
hostname: rabbitmqv3
environment:
- RABBITMQ_DEFAULT_USER=admin
- RABBITMQ_DEFAULT_PASS=admin
- RABBITMQ_NODENAME=rabbitmqv3
ports:
- "5675:5672"
- "15674:15672"
- "25674:25672"
- "14371:4369"
- "5675:5671"
- 集群玩法
具体的加入集群操作与以前的玩法是一样的,核心还是erlang 那套玩法(cookie 一致,基于erlang 的cluster 方式加入集群)
参考操作
// add rabbitmqv2 node 在rabbitmqv2 操作
rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl join_cluster rabbitmq@rabbitmq
rabbitmqctl start_app
// view cluster info in rabbitmq or rabbitmqv2
rabbitmqctl cluster_status
// add rabbitmqv3 node 在rabbitmqv3 操作
rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl join_cluster rabbitmqv2@rabbitmqv2
rabbitmqctl start_app
// view cluster info in rabbitmq or rabbitmqv2 or rabbitmqv3
rabbitmqctl cluster_status
// change cluster name
rabbitmqctl set_cluster_name mymq_cluster
效果
测试quorum queues
主要基于web 页面操作,比较简单
效果,会看到默认就是持久化的,同时包很了leader 以及follower
通过cli 查看
rabbitmq-queues quorum_status mydemo
代码调用
这个很简单,会发现我们重启任何节点对于业务的影响比较小(为了测试使用了独立节点的ip)
var q = 'mydemo';
var open = require('amqplib').connect('amqp://admin:admin@127.0.0.1:5672/'); // 实际可以用lb 地址
open.then(function(conn) {
return conn.createChannel();
}).then(function(ch) {
return ch.consume(q, function(msg) {
if (msg !== null) {
console.log(msg.content.toString());
ch.ack(msg);
}
});
}).catch(console.warn);
说明
quorum-queues 是官方目前推荐的玩法,以前为了高可用的镜像队列玩法,会逐步被淘汰的,当然因为quorum-queues 默认就是持久化的
依赖磁盘的写入操作性能是会有一些影响的,官方提供了一个性能优化指导,目前官方也提供了一种stream 的模式队列,以上是一个简单的
测试,实际使用还有不少需要优化的,但是quorum-queues 队列的确方便了不少,维护以及管理上很方便了
参考资料
https://rabbitmq-website.pages.dev/docs/clustering
https://rabbitmq-website.pages.dev/docs/quorum-queues
https://rabbitmq-website.pages.dev/docs/quorum-queues#performance-tuning
https://github.com/rongfengliang/rabbitmq_quorum_queue_learning