在一台服务器上启动多个Broker
把整个conf文件夹复制一份,比如叫做conf2
修改里面的activemq.xml文件
(1)里面的brokerName 不能跟原来的重复
(2)数据存放的文件名称不能重复
(3)所有涉及的transportConnectors 的端口
修改jetty.xml,主要就是修改端口
<property name=port value=8181/>
到bin下面,复制一个activemq
(1)修改程序的id,不能和前面的重复
ACTIVEMQ_PIDFILE=”$ACTIVEMQ_DATA/activemq2hostname
.pid”
(2)修改配置文件路径
ACTIVEMQ_CONF=”$ACTIVEMQ_BASE/conf2”
(3)修改端口,里面有个tcp的61616的端口,要改成不一样的,最好跟activemq.xml里面的tcp的端口一致
(4)然后就可以执行了,如果执行没有权限的话,就授权:chmod 751 activemq2
ActiveMQ的网络链接
在某些场景下,需要多个ActiveMQ的Broker做集群,那么就涉及到Broker到Broker的通信,这个被称为ActiveMQ的networkConnector
ctiveMQ的networkConnector默认是单向的,一个Broker在一端发送消息,另一Broker在另一端接收消息。这就是所谓的“桥接”
ctiveMQ也支持双向链接,创建一个双向的通道对于两个 Broker,不仅发送消息而且也能从相同的通道来接收消息,通常作为duplex connector来映射
discovery(网络发现)
一般情况下,discovery是被用来发现远程的服务,客户端通常想去发现所有可利用的brokers
用两种网络发现的方式:静态网络发现 动态网络发现
Static networks
Static networkConnector是用于创建一个静态的配置对于网络中的多个Broker。这 种协议用于复合url,一个复合url包括多个url地址。格式如下: static:(uri1,uri2,uri3,…)?key=value
<networkConnectors>
<networkConnector name="local network"
uri="static://(tcp://remotehost1:61616,tcp://remotehost2:61616)"/>
</networkConnectors>
Static networks可用属性
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 :默认为空,要包括的动态消息地址
<dynamicallyIncludedDestinations>
<queue physicalName="include.test.foo"/>
<topic physicalName="include.test.bar"/>
</dynamicallyIncludedDestinations>
staticallyIncludedDestinations :默认为空,要包括的静态消息地址
<staticallyIncludedDestinations>
<queue physicalName="always.include.queue"/>
</staticallyIncludedDestinations>
excludedDestinations :默认为空,指定排除的地址
<networkConnectors>
<networkConnector uri="static://(tcp://localhost:61617)" name="bridge" dynamicOnly="false" conduitSubscriptions="true" decreaseNetworkConsumerPriority="false"> <excludedDestinations>
<queue physicalName="exclude.test.foo"/>
<topic physicalName="exclude.test.bar"/> </excludedDestinations>
<dynamicallyIncludedDestinations>
<queue physicalName="include.test.foo"/>
<topic physicalName="include.test.bar"/> </dynamicallyIncludedDestinations>
<staticallyIncludedDestinations>
<queue physicalName="always.include.queue"/> <topic physicalName="always.include.topic"/>
</staticallyIncludedDestinations> </networkConnector>
</networkConnectors>
duplex :默认false,设置是否能双向通信(重要)
suppressDuplicateQueueSubscriptions:默认false,如果为true, 重复的订阅关系一产生即被阻止
bridgeTempDestinations :默认true,是否广播advisory messages来创建临时destination
staticBridge :默认false,如果为true,只有staticallyIncludedDestinations中配置的destination可以被处理。
Static networks消息的丢失
有这样的场景,broker1和broker2通过networkConnector连接,一些consumers连接到broker1,
消费broker2上的消息。消息先被broker1从broker2上消费掉,然后转发给这些consumers。不幸的是转 发部分消息的时候broker1重启了,这些consumers发现broker1连接失败,通过failover连接到broker2 上去了,但是有一部分他们还没有消费的消息被broker2已经分发到了broker1上去了。这些消息,就好 像是消失了,除非有消费者重新连接到broker1上来消费。怎么办呢?
Static networks消息的丢失的解决方案
从5.6版起,在destinationPolicy上新增的选项replayWhenNoConsumers。这个选项使得broker1上有需要转发的消息但是没有消费者时,把消息回流到它原始broker。同时把enableAudit设置为false,为了防止消息回流后被当做重复消息而不被分发
<destinationPolicy>
<policyMap>
<policyEntries>
<policyEntry queue=">" enableAudit="false"> <networkBridgeFilterFactory>
<conditionalNetworkBridgeFilterFactory replayWhenNoConsumers="true"/> </networkBridgeFilterFactory>
</policyEntry>
</policyEntries>
</policyMap>
</destinationPolicy>
集群的容错
前面讲述的都是Client配置链接到指定的broker上。但是,如果Broker的链接失败怎么办呢?此时,Client有两个选项:要么立刻死掉,要么去连接到其它的broker上。
Failover Protocol
Failover协议实现了自动重新链接的逻辑。这里有两种方式提供了稳定的brokers列表对于Client链接。第一种方式:提供一个static的可用的Brokers列表。第二种方式:提供一个dynamic 发现的可用Brokers。
Failover Protocol 的配置方式
failover:(uri1,...,uriN)?key=value 或者 failover:uri1,...,uriN
#Failover Protocol配置参数
initialReconnectDelay:在第一次尝试重连之前等待的时间长度(毫秒),默认10
maxReconnectDelay:最长重连的时间间隔(毫秒),默认30000
useExponentialBackOff:重连时间间隔是否以指数形式增长,默认true
backOffMultiplier:递增倍数,默认2.0
maxReconnectAttempts: 默认-1|0,自版本5.6起:-1为默认值,代表不限重试次数;0代表从不重试
startupMaxReconnectAttempts:初始化时的最大重连次数。一旦连接上,将使用maxReconnectAttempts 的配置,默认0
randomize:使用随机链接,以达到负载均衡的目的,默认true
backup:提前初始化一个未使用连接,以便进行快速失败转移,默认false
trackMessages:设置是否缓存[故障发生时]尚未传送完成的消息,当broker一旦重新连接成功,便将这些缓存中的消息刷新到新连接的代理中,使得消息可以在broker切换前后顺利传送,默认false
maxCacheSize:当trackMessages启用时,缓存的最大字节,默认为128*1024bytes
updateURIsSupported:设定是否可以动态修改broker uri(自版本5.4起),默认true