ActiveMQ协议配置以及网络链接

事业无穷年。 —— 韩愈

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。

ActiveMQ支持的协议参考文档

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,362评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,330评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,247评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,560评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,580评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,569评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,929评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,587评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,840评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,596评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,678评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,366评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,945评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,929评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,165评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,271评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,403评论 2 342

推荐阅读更多精彩内容