ActiveMQ(七)——ActiveMQ的Network

1、在一台服务器上启动多个Brokerapache

  • 步骤以下(为集群作准备):
    1:把整个conf文件夹复制一份,好比叫作conf2
    2:修改里面的activemq.xml文件
    (1)里面的brokerName不能跟原来的重复
    (2)数据存放的文件名称不能重复,好比:
    <hahaDB directory=”${activemq.data}/kahadb_2”/>
    (3)全部设计的transportConnectors的端口,都要跟前面的不同
    3:修改jetty.xml,主要就是修改端口,好比:
    <property name=”port” value=”8181”/>端口必须和前面的不同
    4:到bin下面,复制一个activemq,好比叫作activemq2;
    (1)修改程序的id,不能和前面的重复
    ACTIVEMQ_PIDFILE=”$ACTIVEMQ_DATA/activemq2-hostname.pid”
    (2)修改配置文件路径
    ACTIVEMQ_CONF=”$ACTIVEMQ_BASE/conf2”
    (3)修改端口,里面有个tcp的61616的端口,要改为不同的,最好跟 activemq.xml里面的ctp的端口一致
    (4)而后就能够执行了。

2、ActiveMQ的静态网络连接缓存

  • ActiveMQ的networkConnector是什么
    在某些场景下,须要多个ActiveMQ的Broker作集群,那么久涉及到Broker的通讯,这个被称为ActiveMQ的networkConnector。
        ActiveMQ的networkConnector默认是单向的,一个Broker在一端发送消息,另外一个Broker在另外一端接收消息。这就是所谓的“桥接”。ActiveMQ也支持双向连接,建立一个双向的通道对于两个Broker,不只发送消息并且也能从相同的通道来接收消息,一般做为duplex connector来映射,以下:
    ActiveMQ(七)——ActiveMQ的Network
  • “discovery”的概念
        通常状况下,discovery是被用来发现远程的服务,客户端一般想去发现全部可利用的brokers;另外一层意思,它是基于现有的网络Broker去发现其余可用的Brokers。
        有两种配置Client到Broker的连接方式,一种方式:Client经过Statically配置的方式去链接Broker,另外一种方式:Client经过discovery agents来dynamically发现Brokers
  • Static networks
        Static networkConnector是用于建立一个静态的配置对于网络中的多个Broker。这种协议用于复合url,一个复合url包括多个url地址。格式以下:
    static:(uri1,uri2,uri3,...)?Key=value
    1:配置示例以下(activemq.xml--注释掉persistenceFactory节点):
    <networkConnectors>
    <networkConnector name="local network" uri="static://(tcp://remotehost1:61616,tcp://remotehost2:61616)"/>
    </networkConnectors>
  • Static networkConnector的基本原来示意图:
    ActiveMQ(七)——ActiveMQ的Network
        上图中,两个Brokers是经过一个static的协议来网络连接的。一个Consumer连接到BrokerB的一个地址上,当Producer在BrokerA上以相同的地址发送消息时,此时它将被转移到BrokerB上。也就是,BrokerA会转发消息到BrokerB上。
  • networkConnector配置的可用属性
    一、name:默认是bridge
    二、dynamicOnly:默认是false,若是为true,持久订阅被激活时才建立对应的网络持久订阅。默认是启动时激活
    三、decreaseNetworkConsumerPriority:默认是false。设定消费者优先权,若是为true,网络的消费者优先级下降为-5。若是为false,则默认跟本地消费者同样为0
    四、networkTTL:默认是1,网络中用于消息和订阅消费的broker数量
    五、messageTTL:默认是1,网络中用于消息的broker数量
    六、consumerTTL:默认是1,网络中用于消费的broker数量
    七、conduitSubscriptions:默认true,是否把同一个broker的多个consumer当作一个来处理
    八、dynamicallyIncludedDestinations:默认为空,要包括的动态消息地址,相似于excludedDestinations,如
    <dynamicallyIncludedDestinations>
    <queue physicalName="include.test.foo"/>
    <topic physicalName="include.test.bar"/>
    </dynamicallyIncludedDestinations>

    九、staticallyIncludedDestinations:默认为空,要包括的静态消息地址。相似于excludedDestinations,如:服务器

    <staticallyIncludedDestinations>
    <queue physicalName="always.include.queue"/>
    </staticallyIncludedDestinations>

    十、excludedDestinations:默认为空,指定排除的地址,示例以下:
    ActiveMQ(七)——ActiveMQ的Network
    十一、duplex:默认false,设置是否能双向通讯
    十二、prefetchSize:默认是1000,持有的未确认的最大消息数量,必须大于0,由于网络消费者不能本身轮询消息
    1三、suppressDuplicateQueueSubscriptions:默认false,若是为true,重复的订阅关系一产生即被阻止
    1四、bridgeTempDestinations:默认true,是否广播advisory messages来建立临时destination
    1五、alwaysSyncSend:默认false,若是为true,非持久化消息也将使用request/reply方式代替oneway方式发送到远程broker
    1六、staticBridge:默认false,若是为true,只有staticallyIncludedDestinations中配置的destination能够被处理网络

3、“丢失”的消息
     存在这样的场景,broker1和broker2经过networkConnector链接,一些consumers链接到broker1,消费broker2上的消息。消息先被broker1从broke2上消费掉,而后转发给这些consumers。不幸的是转发部分消息的时候broker1重启了,这些consumers发现broker1链接失败,经过failover链接到broker2上去了,可是又一部分他们尚未消费的消息被broker2已经分发到broker1上去了。这些消息,就好像是消失了,除非有消费者从新链接到broker1上来消费。
     从5.6版起,在destinationPolicy上新增的选项replayWhenNoConsumers。这个选项使得broker1上有须要转发的消息可是没有消费者时,把消息回流到它原始的broker。同时把enableAudit设置为false,为了防止消息回流后被当作重复消息而不被分发,示例以下:负载均衡

<destinationPolicy>
    <policyMap>
        <policyEntry queue=">" enableAudit="false">
            <networkBridgeFilterFactory>
                <conditionalNetworkBridgeFilterFactory replayWhenNoConsumers="true"/>
            </networkBridgeFilterFactory>
        </policyEntry>
    </policyMap>
</destinationPolicy>

4、容错的链接dom

  • Failover Protocol
        以前的都是Client配置连接到指定的broker上。可是,若是Broker的连接失败怎么办?此时,Client有两个选项:要么马上死掉,要么去链接到其它的broker上。
        Failover协议实现了自动从新连接的逻辑。这里有两种方式提供了稳定的brokers列表对于Client连接。
    第一种:提供一个static的可用的Brokers列表
    第二种:提供一个dynamic发现的可用Brokers
  • Failover Protocol的默认方式
    failover:(uri1,...,uriN)?key=value或者failover:uri1,...,uriN
    & Failover Protocol的默认配置
    默认状况下,这种协议用于随机的去选择一个连接去连接,若是连接失败了,那么会连接到其它的Broker上。默认的配置定义了延迟从新连接,意味着传输将会在10秒后自动的去从新连接可用的broker。全部的从新连接参数都是能够根据应用的须要而配置的。
  • Failover Protocol的使用示例,在客户端程序里面
    ConnectionFactory connectionFactory = new ActiveMQConnectionFactory   ("failover:(tcp://localhost:61616,tcp://localhost:61617)
    ?randomize=false");
  • Failover Protocol可用的配置参数:
    一、initialReconnectDelay:第一次尝试重连以前等待的时间(毫秒)默认10
    二、maxReconnectDelay:最长重连的时间间隔(毫秒),默认30000
    三、useExponentialBackOff:重连时间间隔是否以指数形式增加,默认true
    四、backOffMultiplier:递增倍数,默认2.0
    五、maxReconnectAttempts:默认-1|0,自版本5.6起,-1为默认值,表明不限重连次数;0表明从不重试(只尝试链接一次,并不重连),5.6版本以前,0为默认值,表明不限重试次数;大于0的数,表明最大重试次数。
    六、startupMaxReconnectAttempts:初始化时的最大重连次数。一旦链接上,将使用maxReconnectAttempts的配置,默认0
    七、Randomize:使用随机链接,以达到负载均衡的目的,默认true
    八、Backup:提早初始化一个未使用链接,以便进行快速失败转移,默认false
    九、timeout:设置发送操做的超时时间(毫秒),默认-1
    十、trackMessages:设置是否缓存[故障发生时]还没有传送完成的消息,当broker一旦从新链接成功,便将这些缓存中的消息刷新到新链接的代理中,使得消息能够在broker切换先后顺序传送,默认false
    十一、maxCacheSize:当trackMessages启用时,缓存的最大字节,默认为128*1024 字节
    十二、updateURIsSupported:设定是否能够动态修改broker rui(自版本5.4起),默认true

5、动态网络链接(纯理论)
多播协议multicast
    ActiveMQ使用Multicast协议将一个Service和其余的Broker的Service链接起来。IP multicast是一个被用于网络中传输数据到其余一组接收者的技术。
    IP multicast传统的概念成为组地址。组地址是ip地址在224.0.0.0到239.255.255.255之间的ip地址。ActiveMQ broker使用multicast协议去创建服务与远程的broker的服务的网络链接。tcp

  • 基本的格式配置
    multicast://ip address:port?transportOptions
    一、group:表示惟一的组名称,缺省值default
    二、minmumWireFormatVersion:被容许的最小的wireformat版本,缺省为0
    三、trace:是否追踪记录日志,默认false
    四、useLocalHost:表示本地机器的名称是否为localhost,默认true
    五、datagramSize:特定的数据大小,默认值41024
    六、timeToLive:消息的声明周期值,默认值-1
    七、loopBackMode:是否启用loopback模式,默认false
    八、wireFormat:默认用wireFormat命名
    九、wireFormat.
    :前缀是wireFormatide

  • 配置示例
    1:默认配置,默认状况下是不可靠的多播,数据包可能会丢失
    multicast://default
    2:特定的ip和端口
    multicast://224.1.2.3:6255
    3:特定的ip和端口以及组名
    multicast://224.1.2.3:6255?group=mygroupnameoop

  • ActiveMQ使用multicast协议的配置格式以下:测试

    <broker xmlns="http://activemq.apache.org/schema/core" brokerName="multicast" dataDirectory="${activemq.data}/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:若是防止自动的寻找地址?
    (1)名称为openwire的transport,移除discoveryUri="multicast:
    //default"便可。传输链接用默认的名称openwire来配置broker的tcp多点链接,这将容许其余broker可以自动发现和链接到可用的broker中。
    (2)名称为"default-nc"的networkConnector,注释掉或者删除便可。
    ActiveMQ默认的networkConnector基于multicast协议的链接的默认名称是default-nc,并且自动的去发现其余broker。去中止这种行为,只须要注销或者删除掉default-nc网络链接。
    (3)使brokerName的名字惟一,能够惟一识别Broker的实例,默认是localhost

  • multicast协议和普通的tcp协议
    它们是差很少的,不一样的是multicast可以自动的发现其余broker,从而替代了使用static功能列表brokers。用multicast协议能够在网络中频繁的添加和删除ip不会有影响。
    multicast协议
    好处:可以适应动态变化的地址。
    缺点:自动链接地址会过渡的消耗网络资源

Discovery协议
    Discovery是在multicast协议的功能上定义的。功能相似与Failover功能。它将动态的发现multicast协议的broker的链接而且随机的链接其中一个broker。

  • 基本配置以下:
    discovery:(discoveryAgentURI)?transportOptions
    一、reconnectDelay:再次寻址等待时间,缺省值10
    二、initialReconnectDelay:初始化设定再次寻址等待时间,缺省值10
    三、maxReconnectDelay:最大寻址等待时间,缺省值30000
    四、useExponentialBackOff:是否尝试BackOff重链接,默认是true
    五、backOffMultiplier:尝试Backoff的次数,默认是2
    六、maxReconnectAttempts:若是异常,最大的从新链接个数,默认是0
    七、Group:组惟一的地址,默认是default
    示例:
    discovery:(multicast://default)?initialReconnectDelay=100
  • Discovery协议的配置示例
    <broker name="foo">
    <transportConnectors>
        <transportConnector uri="tcp://localhost:0" discoveryUri="multicast://default"/>
    </transportConnectors>
    </broker>

Peer协议
    ActiveMQ提供了peer transport connector提供了更加容易的去嵌入broker网络中。它建立一个优于vm链接的p2p网络链接。默认格式以下:
peer://peergroup/brokerName?Key=value

  • Peer协议的基本使用
        当咱们启用了peer协议时,应用将自动的启动内嵌broker,也将会自动的去配置其它broker来创建链接,前提是必需要有一个组。配置以下:
    peer://groupa/broker1?Persistent=false
        另外,生产者和消费者都各自链接到嵌入到本身应用的broker,而且在本地的同一个组名中相互访问数据。

  • Peer协议的基本原理
    ActiveMQ(七)——ActiveMQ的Network
    在本地机器断网的状况下,本地的client访问本地brokerA将依然正常。
    在断网的状况下发送消息到本地brokerA,而后网路链接正常后,全部的消息将从新发送并链接到brokerB。
    Fanout协议

Fanout协议是同时链接到多个broker,默认的格式以下:
    fanout:(fanoutURI)?key=value
示例:fanout:(static:(tcp://host1:61616,tcp://host2:61616))
表示client将试图链接到两个static列表中定义的三个URI

  • Fanout协议的配置参数以下:
    一、initialReconnectDelay:从新链接的等待时间,默认是10
    二、maxReconnectDelay:最大从新链接的等待时间,默认是30000
    三、useExponentialBackOff:是否尝试BackOff重链接,默认是true
    四、backOffMultiplier:尝试Backoff的次数,默认是2
    五、maxReconnectAttempts:若是异常,最大的从新链接个数,默认是0
    六、fanOutQueues:是否将topic消息转换queue消息,默认false
    七、minAckCount:Broker链接的最小数,默认是2
    配置示例:
    fanout:(static:(tcp://localhost:61616,tcp://remotehost:61616))?
    initialReconnectDelay=100
    注意:ActiveMQ并不推荐Consumer使用fanout协议。当Provider发送消息到多个broker中,测试Consumer可能受到重复的消息。
相关文章
相关标签/搜索