镜像队列
一、搭建步骤
- 在如何节点
- 重新创建队列时,备份的交换机是由服务器来决定的
- 动态变更IP地址使用实现负载均衡(nginx)
去使用Nginx连接或者SpringClourd
二、搭建联合交换机
- 需要保证每台节点单独运行
- 在每台机器上开启federation插件
rabbitmq-plugins enable rabbitmq_federation
rabbitmq-plugins enable rabbitmq_federation_management
安装成功
2.原理:
node1数据向着node2流动,node2无法向node1流动数据,同步数据是以交换机为节点,node1交换机需要向node2交换机输入数据,node1交换机需要配置node2交换机的地址,前提是consumer在node2创建fed_exchange,node2必须要先有交换机,如果没有就会报错!!!,在node2节点上配置node1,然后添加策略
(1)创建交换机标题
(2)创建交换机与节点
//队列名称
public static final String QUEUE_NAME = "mirrior_hello";
/**
* 联邦交换机
*/
public static final String FED_EXCHANGE = "fed_exchange";
// 接收消息
public static void main(String[] args) throws Exception {
// 创建连接工厂
ConnectionFactory factory = new ConnectionFactory();
factory.setHost("192.168.119.222");
factory.setUsername("admin");
factory.setPassword("123456");
// 连接
Connection connection = factory.newConnection();
// 信道
Channel channel = connection.createChannel();
channel.exchangeDeclare(FED_EXCHANGE,BuiltinExchangeType.DIRECT);
channel.queueDeclare("node2_queue",true,false,false,null);
channel.queueBind("node2_queue",FED_EXCHANGE,"routingKey");
// 声明接收消息
DeliverCallback deliverCallback = (var1, var2) -> {
System.out.println( new String(var2.getBody()));
};
// 声明取消消息
CancelCallback cancelCallback = (String var1) ->{
System.out.println("消费消息被中断");
};
/**
* 消费者 接收消费
* 1.消费哪个队列
* 2.消费成功之后是否要自动应答 true代表的是自动应答 false代表手动应答
* 3.消费者未成功消费的回调
* 4.消费者取消消费的回调
*
*/
channel.basicConsume(QUEUE_NAME,true,deliverCallback,cancelCallback);
}
(3)配置Federation Upstreams
(4)添加一个Policies策略
添加成功
三、搭建联合队列
(1)搭建步骤
四、Shovel
概念:Federation 具备的数据转发功能类似,Shovel 够可靠、持续地从一个 Broker 中的队列(作为源端,即source)拉取数据并转发至另一个 Broker 中的交换器(作为目的端,即 destination)。作为源端的队列和作为目的端的交换器可以同时位于同一个 Broker,也可以位于不同的 Broker 上。Shovel 可以翻译为"铲子",是一种比较形象的比喻,这个"铲子"可以将消息从一方"铲子"另一方。Shovel 行为就像优秀的客户端应用程序能够负责连接源和目的地、负责消息的读写及负责连接失败问题的处理。
(1)搭建步骤
添加插件(需要的机器开启)
rabbitmq-plugins enable rabbitmq_shovel
rabbitmq-plugins enable rabbitmq_shovel_management
在交换机1发送消息到Q1,Q1有一条消息,交换机2发消息给Q2时,Q2会有两条消息,因为Q1的消息会通过shovel给到Q2所以Q2就会有两条消息