美文网首页ActiveMQ消息中间件消息中间件
ActiveMQ协议配置以及网络链接

ActiveMQ协议配置以及网络链接

作者: guqj | 来源:发表于2017-10-29 20:18 被阅读189次

    事业无穷年。 —— 韩愈

    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

    相关文章

      网友评论

        本文标题:ActiveMQ协议配置以及网络链接

        本文链接:https://www.haomeiwen.com/subject/mxwwuxtx.html