目录
一、使用集群原因
二、搭建步骤
1.拉取rabbitmq镜像
注意
2.创建RabbitMQ容器
link由于已经过时,可以使用network代替
3.容器节点加入集群
设置结点1
设置节点2,加入到集群
设置节点3,加入到集群
查看集群状态
4.查看控制台
三、集群测试
测试一:生产者使用5672端口发消息,消费者在5673端口接收消息
生产者代码
消费者代码
测试二:生产者使用5672端口发消息,断开RabbitMQCluster03,消费者在5673端口接收消息
测试三:生产者使用5672端口发消息,断开RabbitMQCluster01,消费者在5673端口接收消息
四、结论
一、使用集群原因
单台 RabbitMQ服务器可以满足每秒 1000 条消息的吞吐量,那么如果应用需要 RabbitMQ 服务满足每秒 10 万条消息的吞吐量呢?购买昂贵的服务器来增强单机 RabbitMQ 务的性能显得捉襟见肘,搭建一个 RabbitMQ 集群才是解决实际问题的关键。
二、搭建步骤
1.拉取rabbitmq镜像
docker pull rabbitmq:3.8-management
注意
拉取的镜像版本是management,如果是latest版本,管理控制台没有开放,需要进入plugins目录,输入以下命令,开放控制台。
rabbitmq-plugins enable rabbitmq_management
2.创建RabbitMQ容器
docker run -d --hostname rabbitmq01 --name rabbitmqCluster01 -p 15672:15672 -p 5672:5672 -e RABBITMQ_ERLANG_COOKIE='rabbitmqCookie' rabbitmq:3.8-management
docker run -d --hostname rabbitmq02 --name rabbitmqCluster02 -p 15673:15672 -p 5673:5672 -e RABBITMQ_ERLANG_COOKIE='rabbitmqCookie' --link rabbitmqCluster01:rabbitmq01 rabbitmq:3.8-management
docker run -d --hostname rabbitmq03 --name rabbitmqCluster03 -p 15674:15672 -p 5674:5672 -e RABBITMQ_ERLANG_COOKIE='rabbitmqCookie' --link rabbitmqCluster01:rabbitmq01 --link rabbitmqCluster02:rabbitmq02 rabbitmq:3.8-management
1.为什么要配置相同的erlang cookie?
因为RabbitMQ是用Erlang实现的,Erlang Cookie相当于不同节点之间相互通讯的秘钥,Erlang节点通过交换Erlang Cookie获得认证。
2.Erlang Cookie的位置
默认情况下,文件在
/var/lib/rabbitmq/.erlang.cookie
。
3.指令介绍
--hostname rabbitmq01 是指创建后集群内的第一个节点名为rabbitmq01
--name 是容器名
使用–link 进行容器之间互连,link不可或缺,使得三个容器能互相通信
link由于已经过时,可以使用network代替
#创建网络,默认是桥接模式
docker network create rabbitmq
#将容器连接到rabbitmq网络中
docker network connect rabbitmq rabbitmqCluster01
docker network connect rabbitmq rabbitmqCluster01
docker network connect rabbitmq rabbitmqCluster01
3.容器节点加入集群
设置结点1
docker exec -it rabbitmqCluster01 bash
rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl start_app
exit
设置节点2,加入到集群
docker exec -it rabbitmqCluster02 bash
rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl join_cluster --ram rabbit@rabbitmq01
rabbitmqctl start_app
exit
设置节点3,加入到集群
docker exec -it rabbitmqCluster03 bash
rabbitmqctl stop_app
rabbitmqctl reset
rabbitmqctl join_cluster --ram rabbit@rabbitmq01
rabbitmqctl start_app
exit
参数“--ram”表示设置为内存节点,忽略次参数默认为磁盘节点。
查看集群状态
rabbitmqctl cluster_status
4.查看控制台
三、集群测试
测试一:生产者使用5672端口发消息,消费者在5673端口接收消息
生产者代码
public class Produce {
//队列名称
public static final String QUEUE_NAME="hello";
public static void main(String[] args) throws IOException, TimeoutException, TimeoutException {
//创建连接工厂
ConnectionFactory factory = new ConnectionFactory();
//工厂ip 连接RabbitMQ队列
factory.setHost("192.168.16.106");
factory.setPort(5673);
factory.setUsername("guest");
factory.setPassword("guest");
//创建连接
Connection connection = factory.newConnection();
//获取信道
Channel channel = connection.createChannel();
HashMap<String, Object> arguments = new HashMap<>();
/*
* 生成一个队列
* 1. 队列名称
* 2. 队列里面的消息是否持久化(磁盘) 默认消息存储在内存中
* 3. 该队列是否只供一个消费者进行消费 是否进行共享 true 可以多个消费者消费
* 4. 是否自动删除 最后一个消费者端开连接以后 该队列是否自动删除 true 自动删除
* 5. 其他参数
*/
channel.queueDeclare(QUEUE_NAME,false,false,false,null);
for(int i=0;i<20;i++){
String message = "info-----"+i;
/**
* 发送一个消息
* 1. 发送到哪个交换机
* 2. 路由的 key 是哪个
* 3. 其他的参数信息
* 4. 发送消息的消息体
*/
channel.basicPublish("",QUEUE_NAME,null,message.getBytes());
}
System.out.println("消息发送完毕");
}
}
消费者代码
public class Consumer {
//队列名称
public static final String QUEUE_NAME="hello";
public static void main(String[] args) throws IOException, TimeoutException {
//创建连接工厂
ConnectionFactory factory = new ConnectionFactory();
//工厂ip 连接RabbitMQ队列
factory.setHost("192.168.16.106");
factory.setPort(5672);
factory.setUsername("guest");
factory.setPassword("guest");
//创建连接
Connection connection = factory.newConnection();
//获取信道
Channel channel = connection.createChannel();
// 推送的消息如何进行消费的接口回调
DeliverCallback deliverCallback = (consumerTag,message) ->{
System.out.println("接收到的消息:"+new String(message.getBody()));
};
//取消消费的一个回调接口 如在消费的时候队列被删除掉了
CancelCallback cancelCallback = consumerTag ->{
System.out.println("消费被中断");
};
/**
* 消费者消费消息
* 1. 消费哪个队列
* 2. 消费成功之后是否要自动应答 true 代表自动应答 false 手动应答
* 3. 当一个消息发送过来后的回调接口
* 4.消费者取消消费的回调
*/
channel.basicConsume(QUEUE_NAME,true,deliverCallback,cancelCallback);
}
}
结果:
测试二:生产者使用5672端口发消息,断开RabbitMQCluster03,消费者在5673端口接收消息
测试三:生产者使用5672端口发消息,断开RabbitMQCluster01,消费者在5673端口接收消息
四、结论
普通集群模式:rabbitmq集群同步指的是复制队列,元数据信息的同步,即同步的是数据存储信息;消息的存放只会存储在创建该消息队列的那个节点上。并非在节点上都存储一个完整的数据。在通过非数据所在节点获取数据时,通过元数据信息,路由转发到存储数据节点上,从而得到数据 。