一、简介
前面讲述的都是Client配置链接到指定的broker上。但是,如果Broker的链接失败怎么办呢?
此时,Client有两个选项:
1、要么立刻死掉
2、要么去连接到其它的broker上。
Failover协议实现了自动重新链接的逻辑。这里有两种方式提供了稳定的brokers列表对于Client链接。
第一种方式:提供一个static的可用的Brokers列表。
第二种方式:提供一个dynamic 发现的可用Brokers。
二、容错的链接(客户端配置)
2.1 Failover Protocol 的配置方式
failover:(uri1,...,uriN)?key=value 或者 failover:uri1,...,uriN
默认情况下,这种协议用于随机的去选择一个链接去链接,如果链接失败了,那么会链接到其他的Broker上。默认的配置定义了延迟重新链接,意
味着传输将会在10秒后自动的去重新链接可用的broker。当然所有的重新链接参数都可以根据应用的需要而配置。默认情况下,这种协议用于随机的
去选择一个链接去链接,如果链接失败了,那么会链接到其他的Broker上。默认的配置定义了延迟重新链接,意味着传输将会在10秒后自动的去重新
链接可用的broker。当然所有的重新链接参数都可以根据应用的需要而配置。
在客户端程序里面:
ConnectionFactory connectionFactory = new ActiveMQConnectionFactory("liuy","123456","failover:(tcp://192.168.91.8:61616,tcp://192.168.91.8:61676)?randomize=false");
可用的配置参数:
1:initialReconnectDelay:在第一次尝试重连之前等待的时间长度(毫秒),默认10
2:maxReconnectDelay:最长重连的时间间隔(毫秒),默认30000
3:useExponentialBackOff:重连时间间隔是否以指数形式增长,默认true
4:backOffMultiplier:递增倍数,默认2.0
5:maxReconnectAttempts: 默认-1|0,自版本5.6起:-1为默认值,代表不限重试次数;0代表从不重试(只尝试连接一次,并不重连),
5.6以前的版本:0为默认值,代表不限重试次数所有版本:如果设置为大于0的数,代表最大重试次数
6:startupMaxReconnectAttempts:初始化时的最大重连次数。一旦连接上,将使用maxReconnectAttempts的配置,默认0
7:randomize:使用随机链接,以达到负载均衡的目的,默认true
8:backup:提前初始化一个未使用连接,以便进行快速失败转移,默认false
9:timeout:设置发送操作的超时时间(毫秒),默认-1
10:trackMessages:设置是否缓存[故障发生时]尚未传送完成的消息,当broker一旦重新连接成功,便将这些缓存中的消息刷新到新连接的代
理中,使得消息可以在broker切换前后顺利传送,默认false
11:maxCacheSize:当trackMessages启用时,缓存的最大字节,默认为128*1024bytes
12:updateURIsSupported:设定是否可以动态修改broker uri(自版本5.4起),默认true
三、动态网络链接
多播协议multicast
ActiveMQ使用Multicast协议将一个Service和其他的Broker的Service连接起来。IP multicast是一个被用于网络中传输数据到其它一组接收者的技术。
Ip multicast传统的概念称为组地址。
组地址是ip地址在224.0.0.0到239.255.255.255之间的ip地址。 ActiveMQ broker使用multicast协议去建立服务与远程的broker的服务的网络链接。
基本的格式配置
multicast://ipadaddress:port?transportOptions
transportOptions选项如下:
1:group:表示唯一的组名称,缺省值default
2:minmumWireFormatVersion:被允许的最小的wireformat版本,缺省为0
3:trace:是否追踪记录日志,默认false
4:useLocalHost:表示本地机器的名称是否为localhost,默认true
5:datagramSize:特定的数据大小,默认值4 * 1024
6:timeToLive:消息的生命周期,默认值-1
7:loopBackMode:是否启用loopback模式,默认false
8:wireFormat:默认用wireFormat命名
9:wireFormat.*:前缀是wireFormat
3.1 配置示例
1:默认配置,请注意,默认情况下是不可靠的多播,数据包可能会丢失
multicast://default
2:特定的ip和端口
multicast://224.1.2.3:6255
3:特定的ip和端口以及组名
multicast://224.1.2.3:6255?group=mygroupname
Activemq使用multicast协议的配置格式如下:
<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:如何防止自动的寻找地址?
(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
3.2 Multicast 协议和普通的tcp协议
它们是差不多的,不同的是Multicast能够自动的发现其他broker,从而替代了使用static功能列表brokers。用multicast协议可以在网络中频繁
的添加和删除ip不会有影响。
multicast协议的好处是:能够适应动态变化的地址。
缺点:自动的链接地址和过度的销耗网络资源。
3.3 Discovery协议
Discovery是在multicast协议的功能上定义的。功能类似与failover功能。它将动态的发现multicast 协议的broker的链接并且随机的链接其中一个broker。
基本配置格式如下:
discovery:(discoveryAgentURI)?transportOptions
transportOptions如下:
1:reconnectDelay:再次寻址等待时间,缺省值10
2:initialReconnectDelay:初始化设定再次寻址等待时间,缺省值10
3:maxReconnectDelay:最大寻址等待时间, 缺省值30000
4:useExponentialBackOff:是否尝试BackOff重链接,默认是true
5:backOffMultiplier:尝试Backoff的次数,默认是2
6:maxReconnectAttempts:如果异常,最大的重新链接个数,默认是0
7:group:组唯一的地址,默认是default
示例:
discovery:(multicast://default)?initialReconnectDelay=100
Discovery协议的配置示例:
<broker name="foo"> <transportConnectors> <transportConnector uri="tcp://localhost:0" discoveryUri="multicast://default"/> </transportConnectors> </broker>
3.4 Peer协议
ActiveMQ提出了peer transport connector 以让你更加容易的去嵌入broker中网络中。它将创建一个优于vm链接的p2p网络链接。
默认格式如下:peer://peergroup/brokerName?key=value
Peer协议基本使用:
当我们启动了用peer协议时,应用将自动的启动内嵌broker,也将会自动的去配置其它broker来建立链接,当然了,前提是必须属于一个组。
配置如下:
peer://groupa/broker1?persistent=false
另外,生产者和消费者都各自链接到嵌入到自己应用的broker,并且在在本地的同一个组名中相互访问数据。
Peer协议的基本原理示意图:
在本地机器断网的情况下,本地的client访问本地brokerA将任然正常。在断网的情况下发送消息到本地brokerA,然后网路链接正常后,所有的
消息将重新发送并链接到brokerB
3.5 Fanout协议
Fanout协议是同时链接多个broker,默认的格式如:fanout:(fanoutURI)?key=value
示例:fanout:(static:(tcp://host1:61616,tcp://host2:61616,tcp://host3:61616))
表示client将试图链接到三个static列表中定义的三个URI
Fanout协议的配置方式如下:
fanout:(discoveryURI)?transportOptions
transportOptions如下:
1:initialReconnectDelay:重新链接的等待时间,默认是10
2:maxReconnectDelay:最大重新链接的等待时间,默认是30000
3:useExponentialBackOff:是否尝试BackOff重链接,默认是true
4:backOffMultiplier:尝试Backoff的次数,默认是2
5:maxReconnectAttempts:如果异常,最大的重新链接个数,默认是0
6:fanOutQueues:是否将topic消息转换queue消息,默认false
7:minAckCount:Broker链接的最小数,默认是2
配置示例:
fanout:(static:(tcp://localhost:61616,tcp://remotehost:61616))?initialReconnectDelay=100
特别提醒
Activemq不推荐使Consumer使用fanout协议。当Provider发送消息到多个broker中,测试Consumer可能收到重复的消息