2016年2月28日星期日

ActiveMQ_017:单机环境下在四节点 Broker 集群 + 高可用情况下使用 Virtual Topic

环境:OS X EI Capitan 10.11.3 + ActiveMQ 5.13

首先参照《单机环境下配置四节点 Broker 集群 + 高可用》一文配置并启动四个Broker节点。

1. 客户端Producer向 Broker1/Broker2(Master/Slave)上发5条消息
代码片段:
(1)"failover:(tcp://127.0.0.1:61617,tcp://127.0.0.1:61618)");
(2)destination = session.createTopic("VirtualTopic.Orders");
访问 http://localhost:8162/admin/topics.jsp,可以看到 VirtualTopic.Orders 已被创建。
访问 http://localhost:8164/admin/topics.jsp,没有看到 VirtualTopic.Orders 。
说明 VirtualTopic 只在客户端连接的 Broker 中可见。

2. 客户端Consumer A 从 Broker1/Broker2(Master/Slave)上收消息
代码片段:
(1)"failover:(tcp://127.0.0.1:61617,tcp://127.0.0.1:61618)");
(2)Destination destinationA = session.createQueue("Consumer.A.VirtualTopic.Orders");
访问 http://localhost:8162/admin/queues.jsp,可以看到 Consumer.A.VirtualTopic.Orders 已被创建。
访问 http://localhost:8164/admin/queues.jsp,可以看到 Consumer.A.VirtualTopic.Orders 已被创建。
说明 Consumer.A.VirtualTopic.Orders 在组成集群的 Broker 中都可见。
但是之前发送到 VirtualTopic.Orders的消息无法收到,这是Topic 固有的特性决定的。

3. 客户端Consumer B 向 Broker3/Broker4(Master/Slave)上收消息
代码片段:
(1)"failover:(tcp://127.0.0.1:61619,tcp://127.0.0.1:61620)");
(2)Destination destinationB = session.createQueue("Consumer.B.VirtualTopic.Orders");
访问 http://localhost:8162/admin/queues.jsp,可以看到 Consumer.B.VirtualTopic.Orders 已被创建。
访问 http://localhost:8164/admin/queues.jsp,可以看到 Consumer.B.VirtualTopic.Orders 已被创建。
说明 Consumer.B.VirtualTopic.Orders 在组成集群的 Broker 中都可见。
但是之前发送到 VirtualTopic.Orders的消息无法收到,这是Topic 固有的特性决定的。

4. 客户端Producer向 Broker1/Broker2(Master/Slave)再发5条消息
代码片段:
(1)"failover:(tcp://127.0.0.1:61617,tcp://127.0.0.1:61618)");
(2)destination = session.createTopic("VirtualTopic.Orders");
访问 http://localhost:8162/admin/queues.jsp,可以看到 Consumer.A.VirtualTopic.Orders 和 Consumer.B.VirtualTopic.Orders 都消费了 5 条消息。

访问 http://localhost:8164/admin/queues.jsp,可以看到 Consumer.A.VirtualTopic.Orders 上没有消息消费,Consumer.B.VirtualTopic.Orders 消费了 5 条消息。


5. 小结
(1)与 VirtualTopic 对应的 Queue 在集群中所有 Broker 可见,并且是所有消费者共享同一个 Queue 中的消息。
(2)VirtualTopic.Orders 是在Broker1/Broker2(Master/Slave)中的,因此在Broker1/Broker2中能看到所有与这个VirtualTopic 对应的 Queue,无论消费者在哪里消费这些 Queue 。
(3)其它消费者,只能在连接到的Broker上看到自己的 Queue 中消费了消息,虽然在该 Broker 上也能看到其它的 Queue,但是不能看到其它的 Queue 消费了消息。
(4)如果本地和远程的 Consumer 都消费同一个 Queue,本地的 Consumer 优先消费。
(5)VirtualTopic 适合用在某个数据中心向其它数据中心分发消息的场景,每个数据中心消费自己的Queue,互不干扰。

没有评论: