1.声明
当前内容用于本人学习和复习之用,当前内容主要包括搭建Federation模式和测试该模式的作用
2.开启Federation模式
使用两台主机搭建
节点 | 节点ip |
---|---|
node1 | 192.168.1.100 |
node2 | 192.168.1.108 |
为所有的主机都开启Federation插件
./rabbitmq-plugins enable rabbitmq_federation_namegement
ui界面效果
3.使用Federation 搭建基于Exchange的模式
1.为所有的主机都添加一个相同名称的Exchange:CommonsExchange
2.为node1添加queue为node1Queue,为node2添加queue为node2Queue,并都绑定CommonsExchange
3.为当前的node1添加一个Federation Upstream:node1Federation(并指定url为:amqp://root:root@192.168.1.108:5672
)
4.为当前的node1添加一个策略:node1Policy并指定参数Federation Upstream为node1Federation
5.查看node1中的Federation Status的状态
解释:上面中node1指定node2作为上游
6.测试:向node2中的CommonsExchange中发送给数据
7.查看ui界面的结果
node1界面
node2界面
发现消息会从node2中转发给node1的CommonsExchange(采取复制的方式)
8.创建消费者用于消费node1的数据
public class ClusterNode2MsgComsumer {
private static String host = "192.168.1.100";
private static int port = 5672;
private static String username = "root";
private static String password = "root";
public static void main(String[] args) throws IOException {
RabbitMqUtils mqUtils = new RabbitMqUtils(host, port, username, password);
String queueName = "node1Queue";
Connection connection = mqUtils.getConnection();
Channel channel = connection.createChannel();
channel.basicConsume(queueName, true, new DefaultConsumer(channel) {
@Override
public void handleDelivery(String consumerTag, Envelope envelope, BasicProperties properties, byte[] body)
throws IOException {
System.out.println("consumerTag==>" + consumerTag);
System.out.println("envelope==>" + envelope);
System.out.println("props==>" + properties);
System.out.println("消费者node2接收消息==>【" + StringUtils.toString(body) + "】");
}
});
}
}
node1、node2节点的消息
发现此时node2节点的数据并没有被消费,说明,Federation模式中消息是转发,会出现重复消费
9.测试向node1中发送数据
此时发现node2中不会有数据,说明消息只能从上游发送到下游
10.搭建将node1作为node2的上游(实现双向的发送)
直接在当前的node2中创建Federation和Policy并指向到当前的node1
再次向node1中发送数据发现消息被转发到了node2
发现可以将node1中的消息复制转发到node2中了
4.查看Federation实现原理
1.查看Connection
发现双方都有两个连接:一个是amqp协议的,一个是direct协议的
2.查看Channel
3.查看Exchange
4.查看Queue
总结
- Federation Upstream就是通过amqp协议进行拉取消息的,通过用户名密码,以及queue
- 会自动打开向其他node的Connection,并自动创建Channel来执行其他操作
5.创建Queue的Federation
基本模式为
- 双方创建相同名称的Queue
- 一方节点创建Federation Upstream并将其指向另外一个节点
- 为创建Federation的一方节点添加Policy并使用Federation Upstream
- 完成(基本操作和上面的Exchange创建完全一致)
这里是显示
6.总结
1.使用Federation Upstream创建的是复制分发模式,不是集群
2.该模式的消息只能从上游发送给下游,并且上游和下游的消费是分开的
3.可以搭建循环的Federation Upstream,当前的Federation UpStream是基于HTTP协议的,使用方式比集群要好
以上纯属个人见解,如有问题请联本人!