ActiveMQ集群简介

来源:互联网 发布:外汇交易商 知乎 编辑:程序博客网 时间:2024/04/28 14:49
1. 概念
    有些环境具有高可用性、数据量巨大的特性,ActiveMQ可以通过组建集群来满足这些系统的需求,我们可以将这个理解为ActiveMQ集群。ActiveMQ集群是由多个相互连接通信的代理(broker)组成的,这些代理之间组成了一个代理网络。这些网络可以有多种拓扑结构,而每一种拓扑结构都有不同的用处,在后续的文章中我们会来了解这些,本文只介绍ActiveMQ中的网络连接器(network connectors)的一些概念、配置以及用法。所谓的网络连接器与传输连接器(transport connectors)不同,后者是客户端到代理的通信连接方式,而前者是针对ActiveMQ代理之间的连接及通信方式。
    通过网络连接器,ActiveMQ代理相互之间可以进行通信。根据消息传递的方向不同,可以将网络连接器分为单向和双向两种类型。单向网络连接器中,消息只能由一个代理发送,而另外一个代理接收;双向网络连接器中,两端的代理既可以发送消息给对方,也能接收对方发送的消息。ActiveMQ默认采用单向网络连接器。
    网络连接器的配置在“conf/activemq.xml"配置文件中进行配置,先来看一下默认的配置:

<!-- The store and forward broker networks ActiveMQ will listen to --><networkConnectors><!-- by default just auto discover the other brokers --><networkConnector name="default-nc" uri="multicast://default"/><!--<networkConnector name="host1 and host2"uri="static://(tcp://host1:61616,tcp://host2:61616)"/>--></networkConnectors>

    可以看到,网络连接器是通过<networkConnectors>节点来配置,它包含子节点<networkConnector>。在<networkConnector>子节点中,name和uri属性是必须的,其他为可选属性。
    要构建一个ActiveMQ集群,那ActiveMQ代理之间必须能够去发现其他的代理。而发现机制又分为静态和动态发现两种机制,其中静态机制是通过在配置文件中配置指定的一些代理;而动态机制是通过探索代理来动态的检测其他的代理。在后续部分我们分别来介绍这两种机制。

2. 静态发现机制
    静态机制是通过简单的在配置中静态的配置我们需要连接的ActiveMQ代理,因此我们需要在配置前知道我们需要连接的broker的地址。它的URI语法如下:
    static:(uri1,uri2,uri3,...)?key=value
    详细的参考可参见:
http://activemq.apache.org/static-transport-reference.html
    按照这个语法,在配置中我们只需按如下配置即可:

<networkConnectors><networkConnector name="local network"uri="static://(tcp://remotehost1:61616,tcp://remotehost2:61616)"/></networkConnectors>

    如果这个是localhost的ActiveMQ代理的配置,并且在启动之前,remotehost1和remotehost2已经启动,那么当我们启动localhost的ActiveMQ时,则会看到如下输出:

...INFO DiscoveryNetworkConnector - Establishing network connection betweenfrom vm://localhost to tcp://remotehost1:61616INFO TransportConnector - Connector vm://localhost StartedINFO DiscoveryNetworkConnector - Establishing network connection betweenfrom vm://localhost to tcp://host2:61616INFO DemandForwardingBridge - Network connection between vm://localhost#0and tcp://remotehost1:61616 has been established.INFO DemandForwardingBridge - Network connection between vm://localhost#2and tcp://remotehost2:61616 has been established....

    以上的输出显示,localhost已经和remotehost1及remotehost2建立了一条以localhost为源点的单向通道。也就是说,localhost收到的消息会转发到remotehost1和remotehost2.

3. 动态发现机制
    ActiveMQ实现了多种动态发现机制,它们可以被代理或者客户端用于动态的发现其它代理并建立必要的连接。接下来我们来分别看下这些协议。

3.1 广播协议
    学过网络的都知道,IP地址中有专门用于广播的地址,它们包括从224.0.0.0到239.255.255.255.ActiveMQ利用广播来向其它代理广播自己的服务,并接收其它代理广播的服务以建立ActiveMQ代理之间的连接。另一方面,客户端利用广播来寻找代理,并与之建立连接。广播协议的networkconnector的URI语法如下:
    multicast://ipaddress:port?key=value
    在配置文件中我们可以按如下示例来配置:

<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>

    以上配置中使用的广播地址为默认地址,默认为239.255.2.3。以上的例子中还有两点需要说明,首先,<networkConnector>的uri属性,它在这里是用于给ActiveMQ来发现其它代理,并与发现的代理建立连接,此时的ActiveMQ代理就像其它代理的客户端一样,通过广播来寻找其它代理并与之建立连接。其次,<transportConnector>的discoveryUri属性是用来告诉ActiveMQ,在这里广播ActiveMQ的代理服务,所有对此感兴趣的客户端都可以利用这个广播消息来发现代理。
    广播协议适用于ActiveMQ经常动态的添加或者移除的场景,在这种情况下,ActiveMQ代理可以自动发现更新,并自动建立代理集群,而不必人工去修改每个ActiveMQ的配置。但是也正是由于这点,当我们添加一个并不想加入集群的ActiveMQ代理时,我们必须做许多额外的设置,以避免它被自动的加入集群。另外,由于广播消息会消耗很大的网络带宽,因此这种方式只适用于局域网,一般广域网是禁止使用广播来自动建立ActiveMQ集群的。

3.2 发现协议(discovery protocol)
    discovery协议是用于支持广播协议的ActiveMQ的客户端的,客户端可以利用这个协议来发现ActiveMQ代理。协议的URI语法如下:
    discovery:(discoveryAgentURI)?key=value
    通过这个协议,可以不必在客户端指定需要使用的transportConnector,而让客户端自己通过ActiveMQ的广播消息来发现ActiveMQ代理,并与之建立连接。详细介绍可以参见:
http://activemq.apache.org/discovery-transport-reference.html

3.3 Peer协议
    ActiveMQ提供了VM协议的transportConnector,用于在应用程序中嵌入ActiveMQ代理;同时ActiveMQ还提供了Peer协议,以支持在应用程序中嵌入ActiveMQ集群,嵌入的ActiveMQ集群中所有的代理均在本地。Peer协议的URI语法如下:
    peer://peergroup/brokerName?key=value
    当应用程序中以这个方式启动一个ActiveMQ时,会在应用程序中嵌入一个ActiveMQ代理,同时这个代理会被配置与本地其他程序中具有相同peergroup名称的代理建立连接,从而组成一个嵌入的ActiveMQ本地集群。详细的介绍可以参见:http://activemq.apache.org/peer-transport-reference.html


3.4 fanout协议
    fanout协议用于让客户端同时连接至多个ActiveMQ代理,它既可以使用静态机制,也可以使用动态机制。它的URI语法如下:
    fanout:(fanoutURI)?key=value
    例如,fanout:(static:(tcp://host1:61616,tcp://host2:61616,tcp://host3:61616))会让客户端同时连接至host1,host2,host3这个三个服务器上的ActiveMQ代理;而fanout:(multicast://default)会让客户端连接至所有能够发现的ActiveMQ代理。关于fanout协议,具体可参见:
http://activemq.apache.org/fanout-transport-reference.html
0 0