事业无穷年。 —— 韩愈
1. TransportConnector支持的协议
ActiveMQ通过网络连接器这种连接机制来实现客户端与服务端之间的通信。
ActiveMQ支持的client-broker通讯协议有:TCP、NIO、UDP、SSL、Http(s)、VM。 其中配置Transport Connector的文件在activeMQ安装目录的conf/activemq.xml中的<transportConnectors>标签之内。
1.1 TCP协议
该协议是ActiveMQ默认的Broker配置,TCP的Client监听端口61616。连接的URI格式为tcp://hostname:portkey=value&key=value(参数可选)。
使用该协议,在网络传输数据前,必须要实现序列化,消息是通过一个叫wire protocol的来序列化成字节流。默认情况下,ActiveMQ把wire protocol叫做OpenWire。
在activemq.xml中的配置示例如下:
<transportConnectors>
<transportConnector name="tcp" uri="tcp://localhost:61616?trace=true"/>
</transportConnectors>
在客户端的代码示例如下:
connectionFactory =newActiveMQConnectionFactory("admin","admin","tcp://127.0.0.1:61616");
1.2 NIO协议
NIO协议和TCP协议类似,但NIO的性能比TCP更好,因此建议使用NIO协议。
NIO连接的URI格式为nio://hostname:portkey=value&key=value(参数可选)。
在activemq.xml中的配置示例如下:
<transportConnectors>
<transportConnector name="nio" uri="nio://localhost:61618?trace=true"/>
</transportConnectors>
在客户端的代码示例如下:
connectionFactory =newActiveMQConnectionFactory("admin","admin","nio://127.0.0.1:61616");
1.3 UDP协议
UDP协议是不保证数据的可靠性的,因此UDP通常用在快速数据传递和不怕数据丢失的场景中。
UDP连接的URI格式为udp://hostname:portkey=value&key=value(参数可选)。
在activemq.xml中的配置示例如下:
<transportConnectors>
<transportConnector name="udp" uri="udp://localhost:61618?trace=true"/>
</transportConnectors>
在客户端的代码示例如下:
connectionFactory =newActiveMQConnectionFactory("admin","admin","udp://127.0.0.1:61616");
1.4 SSL协议
连接的URL形式: ssl://hostname:port?key=value。
在activemq.xml中的配置示例如下:
<transportConnectors>
<transportConnector name="ssl" uri="ssl://localhost:61618?trace=true"/>
</transportConnectors>
在客户端的代码示例如下:
connectionFactory =newActiveMQConnectionFactory("admin","admin","ssl://127.0.0.1:61616");
1.5 HTTP协议
连接的URL形式: http://hostname:port?key=value。
在activemq.xml中的配置示例如下:
<transportConnectors>
<transportConnector name="http" uri="http://localhost:61618?trace=true"/>
</transportConnectors>
在客户端的代码示例如下:
connectionFactory =newActiveMQConnectionFactory("admin","admin","http://127.0.0.1:61616");
1.5 VM协议
如果客户端和broker在一个虚拟机内的话,通过VM协议通讯在VM内通讯,从而减少网络传输的开销。
VM协议的连接的URI形式: vm//brokerName?key=value。
2. 容错的链接
上面的例子都是配置连接到指定的Broker上,若Broker挂掉,客户端就无法正常链接到Broker上了。Failover协议实现了自动重新链接的逻辑,当一个Broker链接失败时,那么会链接到其他的Broker上。有两种方式提供了稳定的Brokers列表供Client链接。
(1) 提供一个static的可用的Brokers列表。
(2) 提供一个dynamic 发现的可用Brokers。
2.1 客户端配置 - Failover Protocol的配置方式
Failover Protocol的配置格式如下:
failover:(uri1,...,uriN)?key=value 或者 failover:uri1,...,uriN
在客户端的代码示例如下:
ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("admin","admin","failover:(tcp://192.168.91.8:61616,tcp://192.168.91.8:61676)?randomize=false");
2.2 服务端配置 - 静态网络链接
网络链接(networkConnector)指的是Broker到Broker的通信。ActiveMQ的networkConnector默认是单向的,一个Broker在一端发送消息,另一Broker在另一端接收消息。当然也支持双向,这样对于两个Broker,不仅发送消息而且也能从相同的通道来接收消息。
静态网络链接用于创建一个静态的配置对于网络中的多个Broker。一个复合url包括多个url地址,格式如:static:(uri1,uri2,uri3,...)?key=value。
在activemq.xml中的配置示例如下:
<!—配置网络连接,采用静态发现。duplex=true,意味双向连接,192.168.91.8和192.168.91.8两个Broker则无须配置-->
<networkConnectors>
<networkConnector name="localNetwork" uri="static://(tcp://192.168.91.8:61616,tcp://192.168.91.8:61676)" duplex="true"/>
</networkConnectors>
静态网络链接基本原理:
上图中,两个Brokers是通过一个static的协议来网络链接的。一个Consumer链接到brokerB的一个地址上 ,当Producer在brokerA上以相同的地址发送消息时,此时它将被转移到brokerB上。也就是,BrokerA会转发消息到BrokerB上。
2.3 服务端配置 - 动态网络链接
动态网络链接指的是能动态的发现在网络上可用的Broker。
2.3.1 multicast协议
ActiveMQ使用Multicast协议将一个Broker和其他的Broker连接起来。
multicast的基本的格式配置如下:
multicast://ipadaddress:port?transportOptions
配置示例如下:
(1) 默认配置:
multicast://default
请注意,默认情况下是不可靠的多播,数据包可能会丢失
(2) 特定的ip和端口
multicast://224.1.2.3:6255
(3)特定的ip和端口以及组名
multicast://224.1.2.3:6255?group=mygroupname
在ActiveMQ.xml中的完整配置示例:
<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>
上面的示例中:
1:uri=“multicast://default”中的default是activemq默认的ip,默认动态的寻找地址。
2:“discoveryUri”是指在transport中用multicast的default的地址传递。
3:“uri”指动态寻找可利用的地址。
4:如何防止自动的寻找地址?
4.1:名称为openwire的transport,移除discoveryUri=”multicast://default”即可。
4.2:名称为“default-nc”的networkConnector,注释掉或者删除即可。ActiveMQ默认的networkConnector基于multicast协议的链接的默认名称是default-nc,而且自动的去发现其他broker。
4.3:设置brokerName的名字唯一,可以唯一识别Broker的实例,默认是localhost。
2.3.2 discovery协议
discovery是在multicast协议的功能上定义的。功能类似与failover功能。它将动态的发现multicast协议的broker的链接并且随机的链接其中一个broker。
discovery基本配置格式如下:
discovery:(discoveryAgentURI)?transportOptions
在ActiveMQ.xml中的完整配置示例如下:
<broker name="foo">
<transportConnectors>
<transportConnector uri="tcp://localhost:0" discoveryUri="multicast://default"/>
</transportConnectors>
</broker>
2.3.3 peer(对等)协议
ActiveMQ提供了VM协议的transportConnector,用于在应用程序中嵌入ActiveMQ代理;同时ActiveMQ还提供了Peer协议,以支持在应用程序中嵌入ActiveMQ集群,嵌入的ActiveMQ集群中所有的代理均在本地。
Peer协议的URI语法如下:peer://peergroup/brokerName?key=value。
当应用程序中以这个方式启动一个ActiveMQ时,会在应用程序中嵌入一个ActiveMQ代理,同时这个代理会被配置与本地其他程序中具有相同peergroup名称的代理建立连接,从而组成一个嵌入的ActiveMQ本地集群。
2.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代理。
参考资料
ActiveMQ集群简介
peer protocol
discovery protocol
fanout protocol