ActiveMQ支持多服务器(Broker)之间的网络链接,也就是集群。经过集群多个ActiveMQ Broker的实例,提供一个对外的统一服务,用来提升ActiveMQ的可用性和扩展性。java
服务器之间的通讯,按照通讯方式能够分为两种,桥接转发(Bridge Forwarding)和双向传输(duplex)。顾名思义,桥接转发是将消息传递给另一个ActiveMQ的Broker,双向传输是用一个通道既能够收消息,也能够发消息。算法
按照发现Broker的方式来区分,也能够分红另外两种,静态注册和动态发现。若是你确切的知道每一台Broker的地址和端口号,那么可使用静态注册的方式;若是你并不知道每一台Broker的状况,好比,一个可动态扩展的生产环境,那么动态发现方式将很是合适。apache
每一种通讯方式,一样是经过编辑%ACTIVEMQ_HOME%conf\activemq.xml文件来完成配置。以下:服务器
<networkConnectors> <networkConnector name="default-nc" uri="multicast://default"/> </networkConnectors>
在networkConnectors的节点下能够配置多个networkConnector,每一个networkConnector是一种Broker-to-Broker的通讯方式。下面具体介绍一下ActiveMQ支持的Broker-to-Broker的几种协议。网络
静态注册:运维
服务器端的Static Connector:被设置为Static Connector的两个Broker之间会转发消息,发给BrokerA的消息,会转发给BrokerB。但不是实时转发,而是在Consumer访问BrokerB的时候再转发。配置以下:dom
<broker xmlns="http://activemq.apache.org/schema/core" brokerName="BrokerB" dataDirectory="${activemq.base}/data"> <transportConnectors> <transportConnector name="openwire" uri="tcp://localhost:61616" /> </transportConnectors> <networkConnectors> <networkConnector uri="static:(tcp://remotehost:61616)" /> </networkConnectors> </broker>
这样,发给remotehost的消息,会在Consumer从localhost中取消息的时候自动转发过去。tcp
Static Connector比较适合用在须要分散Consumer链接的场景。好比:有一个Broker有不少Consumer,并且每一个Consumer在不一样的地区。若是每一个Consumer都链接同一个Broker,那么这个Broker将维护大量的链接,若是每一个地区一个Broker,则每一个地区的Consumer只须要链接本地的Broker。Broker之间经过Static自动转发消息,能够缓解单台Broker链接过多的问题。测试
在实际测试的时候发现了《ActiveMQ in Action》书中有一点没写清楚。只有Queue才是Consumer消费的时候转发消息。持久化Topic是同步转发消息的,而且remotehost上面的消息都会被标记为已消费。url
客户端的Failover Protocol:顾名思义,这个协议是失效转移。客户端会默认使用随机算法选择事先配置好的几个Broker之一;也能够关闭随机选择。若是被选中的Broker发生情况,致使不能提供服务,客户端会选择另外一个可用的Broker,若是某个Broker不可用,ActiveMQ会无限制的重试。(每次链接重试的延迟时间可配置)
默认配置,使用随机选择Broker算法:
failover:(tcp://localhost:61616,tcp://remotehost:61616)
关闭随机选择,优先选择第一个配置的Broker,只有以前的Broker不可用,再选择后面Broker:
failover:(tcp://localhost:61616,tcp://remotehost:61616)?randomize=false"
因为自动重连机制,因此强烈推荐客户端使用faliover,即便是只有一个Broker,也能够经过自动重连功能,在Broker从新启动以后从新建立链接,而不用手动重启客户端。这样能够提高程序的健壮性。
注意这个failover和static是不一样的,static链接是用于服务器端自动转移消息,客户端并不知道服务器端是怎么转移消息的,也不知道到底服务器是几个,对客户端是彻底透明的。failover是客户端失效转移,客户端链接服务器的的url须要明确的指出,因此客户端必须知道服务器端的网络拓扑结构。
动态发现:
服务器端的Multicast Connector:服务器之间经过广播功能自动发现其余服务器。每一个服务器都会把本身的服务发布给224.0.0.0 - 239.255.255.255 IP地址段,也会从这个地址段找寻其余服务器。这样多个服务器之间能够主动的相互发现。配置以下:
<broker xmlns="http://activemq.apache.org/schema/core" brokerName="multicast" dataDirectory="${activemq.base}/data"> <networkConnectors> <networkConnector name="default-nc" uri="multicast://default"/> </networkConnectors> <transportConnectors> <transportConnector name="openwire" uri="tcp://localhost:61616" discoveryUri="multicast://default"/> </transportConnectors> </broker>
在networkConnectors节点中配置multicast协议,用于寻找其余支持multicast的服务器。在transportConnector节点配置discoveryUri,声明服务器自己支持multicast协议。
广播自动发现服务器,适合于常常动态增减服务器的状况。优势是增减服务器,不须要为每一个其余服务器节点修改配置。缺点是服务自动发现,缺乏配置文件,对调试有影响。另外须要注意的是,因为广播功能,常常产生大量的消息传输,因此不少状况下运维是关掉这个服务的。使用Multicast Connector前要确保这个服务是开启的。
客户端的Discover Protocol:和Failover Protocol差很少,只不过是动态发现服务。配置以下:
discovery:(multicast://default)
这样客户端会自动链接广播的url在multicast://default的服务器。
客户端的Fanout Protocol:扇出协议,用于一个客户端同时向多个服务器发一样的消息。
静态查找配置以下:
fanout:(static:(tcp://host1:61616,tcp://host2:61616,tcp://host3:61616))
固然也能够支持动态发现:
fanout:(multicast://default)
这个适用场景不多,毕竟客户端直接控制发冗余消息给服务器,实际上将变得更加不可控,不建议使用。
客户端的Peer Protocol:对等协议,用于前嵌入式服务器的链接,使用场景较少。