文档章节

ActiveMQ学习笔记(8)-Broker Cluster

N
 NicLee
发布于 2017/08/07 10:33
字数 2164
阅读 19
收藏 0

1 网状集群介绍

1.1 特征

    一群ActiveMQ Broker可以组成Broker 网络,即Broker Cluster,称之为连接网络集群、节点集群或者网状集群。网状集群有两种,分别是Static Discovery集群 和 Dynamic Discovery集群。本文后续也会讲到两种集群的配置方式。

网状集群具有以下特征:

 客户端连接的Broker节点失效,可以自动连接到其它Broker节点上。

 Broker可以发现集群中的其它Broker节点。

 消息可以在多个Broker之间路由。

 某个Broker上的消费者挂掉,尚未消费的消息会被路由到其它Broker(有存活的消费者)。

 Broker支持分布式的队列和主题。

这些特征,分别涉及了failover、 Discovery of Brokers和 Networks of Brokers。

1.2 failover

Client连接上若干的Broker中的一个,如果被连接的Broker失效,那么Client会通过failover机制自动连接到其它的Broker。

前面的学习笔记中也曾提到,Client使用failover机制,只需要Client编程时设置failover URL即可,示例如下。

String url = "failover:(tcp://localhost:61616,tcp://localhost:61626)?randomize=false";
ConnectionFactory contectionFactory = new ActiveMQConnectionFactory(user, password, url);

更多关于ActiveMQ的failover机制,参见

http://activemq.apache.org/failover-transport-reference.html

1.3 Discovery of brokers

     Discovery of Brokers分为Static Discovery和Dynamic Discovery两种,其目的是让一个Broker节点知道网络中还有哪些Broker节点。

    Static Discovery,静态发现,就是采用一个写死的URL列表发现其它可以连接的Broker节点。采用这种发现机制的连接,将会尝试所有的URL,直到成功。(这是官网上鬼话的翻译http://activemq.apache.org/static-transport-reference.html )

    通俗地说,静态发现就把所有的Broker节点URL都写死在activemq.xml中,URL示例如下。

    static:(tcp://localhost:61616,tcp://remotehost:61617?trace=false)

    Dynamic Discovery,动态发现,在配置Broker实例时,不需要知道所有其它实例的URL地址,而是采用多播(multicast)的方式,动态发现其它节点。其URL示例如下。

    discoveryUri="multicast://default"

动态发现的更多知识参见http://activemq.apache.org/discovery-transport-reference.html 。

1.4  Networks of Brokers

    如果网络中有多个Broker和多个Client,那么很有可能一个Broker节点只有producers(生产者),而没有consumers(消费者)。独立节点并不了解其它节点上的消费者,也就是说如果某个节点上没有消费者,那么这个节点上的消息可能会因得不到处理而积压起来。

    目前的解决方案是采用Networks of Brokers(节点网络)。它支持分布式的队列和主题。一个节点会相同地对待所有的订阅(subscription):不管他们是来自本地的客户端连接,还是来自远程节点,它都会递送有关的消息拷贝到每个订阅。远程节点得到这个消息拷贝后,会依次把它递送到其内部的本地连接上。

 

2 Static Discovery集群

2.1 部署AMQ

假设D:\MQ\apache-activemq\nob_static目录下有两个amq实例

D:\MQ\apache-activemq\nob_static\amq1

D:\MQ\apache-activemq\nob_static\amq2

2.2 配置activemq.xml

对于amq1

<!—修改brokerName-->
<broker xmlns="http://activemq.apache.org/schema/core" brokerName="static-broker1" 
               dataDirectory="${activemq.data}">

<transportConnectors>
  <!-通道只留下openwire,默认端口61616 -->
  <transportConnector name="openwire" uri="tcp://0.0.0.0:61616"/>
</transportConnectors>

对于amq2

<!—修改brokerName-->
<broker xmlns="http://activemq.apache.org/schema/core" brokerName="static-broker2" 
               dataDirectory="${activemq.data}">

<!—配置网络连接,采用静态发现。duplex=true,意味双向连接,amq1无须配置-->
<networkConnectors>
  <networkConnector uri="static:(tcp://localhost:61616)" duplex="true"/>
</networkConnectors>

<transportConnectors>
  <!-通道只留下openwire,端口61618 -->
  <transportConnector name="openwire" uri="tcp://0.0.0.0:61618"/>
</transportConnectors>

 

同一台机器上部署两个节点,为了防止端口冲突,把jetty.xml中的8161端口改成8162。

2.3 启动

先启动amq1,再启动amq2,观察控制台。

amq2输出信息

Establishing network connection from vm://static-broker2?async=false&network=true 
to tcp://localhost:61616

amq1输出信息

Network connection between vm://static-broker1#4 and 
tcp:///127.0.0.1:51578@61616 (static-broker2) has been established.

 

3 Dynamic Discovery集群

3.1 部署AMQ

假设D:\MQ\apache-activemq\nob_dynamic目录下有两个amq实例

D:\MQ\apache-activemq\nob_dynamic\amq1

D:\MQ\apache-activemq\nob_dynamic\amq2

 

3.2 配置activemq.xml

对于amq1

<!—修改brokerName-->
<broker xmlns="http://activemq.apache.org/schema/core" brokerName="dynamic-broker1" 
               dataDirectory="${activemq.data}">

<!—broker节点下增加配置网络连接,采用动态发现-->
<networkConnectors>
  <networkConnector uri="multicast://default"/>
</networkConnectors>

<transportConnectors>
  <!-通道只留下openwire,默认端口61616 ,增加 discoveryUri -->
  <transportConnector name="openwire" uri="tcp://0.0.0.0:61616" 
                      discoveryUri="multicast://default" />
</transportConnectors>

 

对于amq2

<!—修改brokerName-->
<broker xmlns="http://activemq.apache.org/schema/core" brokerName="dynamic-broker2" 
               dataDirectory="${activemq.data}">
<!—broker节点下增加配置网络连接,采用动态发现-->
<networkConnectors>
  <networkConnector uri="multicast://default"/>
</networkConnectors>

<transportConnectors>
  <!-通道只留下openwire,端口61618,配置discoveryUri -->
  <transportConnector name="openwire" uri="tcp://0.0.0.0:61618" 
                      discoveryUri="multicast://default" />
</transportConnectors>

 

    同一台机器上部署两个节点,为了防止端口冲突,把jetty.xml中的8161端口改成8162。

 

3.3 启动

    先启动amq1,再启动amq2,观察控制台。

    AMQ1输出信息

Network connection between vm://dynamic-broker1#2 and 
tcp://guohj-pc/192.168.56.1:61618@49858 (dynamic-broker2)has been established.

 

    AMQ2输出信息

Network connection between vm://dynamic-broker2#0 and 
tcp://guohj-pc/192.168.56.1:61616@49899 (dynamic-broker1)has been established.

 

4 程序验证

    写程序验证一下。Client的生产者向broker1(amq1)发送“hello, world!”,消费者连接broker2(amq2),接受到“hello, world!”消息。

    生产者连接URL(61616,amq1)和队列名

String url = "failover:tcp://localhost:61616";
String subject = "TOOL.DEFAULT";//队列名要相同

 

    消费者连接URL(61618,amq2)和队列名

String url = "failover:tcp://localhost:61618";
String subject = "TOOL.DEFAULT";//队列名要相同

 

5 Network Connector

5.1 属性介绍

参数名 默认值 描述
name bridge 网络连接器名称,如果相同的两个节点间有多个网络连接器, 则每个网络连接器要使用不同的名称。
dynamicOnly false 仅动态转发,如果为true,只有连接到节点上的消费者处于活动时, 消息才转发。
decreaseNetworkConsumerPriority false (在网络跃点时)是否降低分发到队列消费者的优先级,实际上是对消费 者优先级的控制。
networkTTL 1 在节点网络中,消息或者订阅者能够跨越的节点的数量。
conduitSubscriptions true 是否开启导管订阅,在节点网络中,多个消费者订阅(同一节点上)同一 目标,是否被当作同一个消费者。
excludedDestinations 排除目标列表,在该列表中的目标,将不会进行消息转发。
dynamicallyIncludedDestinations 动态包含列表,在该列表中的目标,将可以进行消息转发,如果为空,则意味着所有目标都可以转发。
staticallyIncludedDestinations 静态包含列表,在该列表中的目标,将可以进行消息转发,即使目标上没 有消费者,消息也可以转发出去。
duplex false 是否双工,如果为true,则一个网络连接在生产者和消费者间可以双向传 递消息。此参数对hub-spoke模式特别有用,尤其是hub受防火墙保护时。

 

5.2 管道订阅-conduitSubscriptions

         

      如果两个brokers,分别是brokerA和brokerB,它们之间用forwarding bridge连接。有三个Consumer,订阅同一个Queue,其中1个连接到brokerA,2个连接到brokerB。

      如果conduitSubscriptions=true,那么brokerA上的consumer会得到15条消息,另外15条消息会发送给brokerB。此时负载并不均衡,因为此时brokerA将brokerB上的两个consumers视为1个。

      如果conduitSubscriptions=false, 那每 个consumer上都会收到10条消息。

5.3 双工-duplex

        前文配置静态网络连接集群的时候,已经用到了duplex。NetworkConnector在需要转发消息时默认是单向连接的。当broker2中配置duplex=true时,就变成了双向连接;即相当于配置了broker2到broker1的网络连接,也配置了broker1到broker2的网络连接。

        两个broker间可以建立两个以上的双向网络连接,从而增加吞吐量,或者对主题\队列分区,只需要指定它们使用不同的name即可。

6 总结

6.1 示例配置

ActiveMQ的examples目录中有静态集群和动态集群的配置示例,可以直接启动两个Broke实例。在cmd窗口中进入目录D:\MQ\apache-activemq\apache-activemq-5.10.1\bin。

启动动态集群,执行以下命令。

activemq-admin start xbean:../examples/conf/activemq-dynamic-network-broker1.xml
activemq-admin start xbean:../examples/conf/activemq-dynamic-network-broker2.xml

 

启动静态集群,执行以下命令。

activemq-admin start xbean:../examples/conf/activemq-static-network-broker1.xml
activemq-admin start xbean:../examples/conf/activemq-static-network-broker2.xml

6.2 优缺点

优点:

支持了消息路由和负载均衡。

 

缺点:

存在单点故障,如果某个Broker失效,有可能造成数据丢失。

 

如果为了保证消息的可靠性和,同时又支持负载均衡,可以采用Broker Cluster + Master Slave 模式的组合。

© 著作权归作者所有

N
粉丝 1
博文 44
码字总数 17686
作品 0
浦东
私信 提问
ActiveMQ-inAction-ActiveMQ-学习笔记

Broker Running Broker ActiveMQ5.0 的二进制发布包中bin目录中包含一个名为activemq的脚本,直接运行这个脚本就可以启动一个broker。 此外也可以通过Broker Configuration URI或Broker XBea...

Java搬砖工程师
06/21
22
0
ActiveMQ-inAction-Broker-学习笔记

Running Broker(运行 broker) ActiveMQ5.0 的二进制发布包中bin 目录中包含一个名为activemq 的脚本, 直接运行这个脚本就可以启动一个broker。 此外也可以通过一下对其进行配置: Broker...

Java搬砖工程师
2018/12/24
44
0
如何建立Master/Slave + Broker Cluster的ActiveMQ集群?

求指导:怎么样建立Master/Slave + Broker Cluster的ActiveMQ集群? 已经会配置和使用Master/Slave ActiveMQ集群 和 Broker Cluster 。但不知道怎么混合使用。或者说支不支持混合使用。请大侠...

nary
2013/05/04
1K
3
ActiveMQ 5.4.1 发布,JMS服务器

ActiveMQ 是Apache出品,最流行的,能力强劲的开源消息总线。ActiveMQ 是一个完全支持JMS1.1和J2EE 1.4规范的 JMS Provider实现,尽管JMS规范出台已经是很久的事情了,但是JMS在当今的J2EE应用...

光石头
2010/11/22
994
0
Java消息中间件入门笔记 - ActiveMQ篇

入门 消息中间件带来的好处: 栗子: 通过服务调用让其它系统感知事件发生 通过消息中间件解耦服务调用 1.Linux安装消息中间件ActiveMQ 1.下载安装包 解压 2.启动与关闭 3.安装验证 4.Maven依...

巅峰小学生
2018/04/30
0
0

没有更多内容

加载失败,请刷新页面

加载更多

nginx学习笔记

中间件位于客户机/ 服务器的操作系统之上,管理计算机资源和网络通讯。 是连接两个独立应用程序或独立系统的软件。 web请求通过中间件可以直接调用操作系统,也可以经过中间件把请求分发到多...

码农实战
今天
5
0
Spring Security 实战干货:玩转自定义登录

1. 前言 前面的关于 Spring Security 相关的文章只是一个预热。为了接下来更好的实战,如果你错过了请从 Spring Security 实战系列 开始。安全访问的第一步就是认证(Authentication),认证...

码农小胖哥
今天
11
0
JAVA 实现雪花算法生成唯一订单号工具类

import lombok.SneakyThrows;import lombok.extern.slf4j.Slf4j;import java.util.Calendar;/** * Default distributed primary key generator. * * <p> * Use snowflake......

huangkejie
昨天
12
0
PhotoShop 色调:RGB/CMYK 颜色模式

一·、 RGB : 三原色:红绿蓝 1.通道:通道中的红绿蓝通道分别对应的是红绿蓝三种原色(RGB)的显示范围 1.差值模式能模拟三种原色叠加之后的效果 2.添加-颜色曲线:调整图像RGB颜色----R色增强...

东方墨天
昨天
11
1
将博客搬至CSDN

将博客搬至CSDN

算法与编程之美
昨天
13
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部