啓動多實例
# 1、將conf文件夾複製一份
cp -r conf/ conf-1/
#主要是修改conf-1目錄activemq.xml
# 2、修改Broker名稱
<broker xmlns="http://activemq.apache.org/schema/core" brokerName="localhost-1" dataDirectory="${activemq.data}">
#3、數據存儲如果使用的是kahaDB,需要更改存儲位置,不能出現重複:
<persistenceAdapter>
<kahaDB directory="${activemq.data}/kahadb_1"/>
</persistenceAdapter>
#4、所有涉及的transportConnectors的端口,都要跟conf裏面的的不一樣
<transportConnectors>
<transportConnector name="openwire" uri="tcp://0.0.0.0:61626?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
<transportConnector name="amqp" uri="amqp://0.0.0.0:5622?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
<transportConnector name="stomp" uri="stomp://0.0.0.0:61623?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
<transportConnector name="mqtt" uri="mqtt://0.0.0.0:1823?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
<transportConnector name="ws" uri="ws://0.0.0.0:61624?maximumConnections=1000&wireFormat.maxFrameSize=104857600"/>
</transportConnectors>
#5、修改jetty.xml,端口:
<bean id="jettyPort" class="org.apache.activemq.web.WebConsolePort" init-method="start">
<!-- the default port number for the web console -->
<property name="host" value="0.0.0.0"/>
<property name="port" value="8162"/>
</bean>
#6、到bin下面,複製一個activemq, 叫activemq-1:
cp -r activemq activemq-1
#7、#activemq-1.xml,ACTIVEMQ_PIDFILE、ACTIVEMQ_CONF需要修改
ACTIVEMQ_PIDFILE="$ACTIVEMQ_DATA/activemq-1.pid"(162行)
ACTIVEMQ_CONF="$ACTIVEMQ_BASE/conf-1" (125行)
networkConnector:
在某些場景下,需要多個ActiveMQ的Broker做集羣,那麼就涉及到Broker到Broker的通信,這個被稱爲ActiveMQ的networkConnector。
ActiveMQ的ne tworkConnector默認是單向的,一 個Broker在一 端發送消息, 另一個Broker在另一端接收消息。這就是所謂的“橋接”。ActiveMQ也支持雙向鏈接,創建一個雙向的通道對於兩個Broker,不僅發送消息而且也能從相同的通道來接收消息,通常作爲duplex connector來映射,如下:
Static networks:
Static networkConnector是用於創建一一個靜態的配置對於網絡中的多個Broker。這種協議用於複合url,一個複合url包括多個url地址。格式如下:static: (uri1, uri2, uri3,…) ?key=value
// 在broker標籤裏面配置
<networkConnectors>
<networkConnector name="local network"
uri="static://(tcp://192.168.100.155:61616,tcp://192.168.100.155:61626)"/>
</networkConnectors>
這樣配置之後可以看到,當61616發送消息時,61626也是可以接收到的。這個就是單向鏈接.
當brokerA(61616)和brokerB(61626)使用單向鏈接時.一般情況下brokerB會比A優先接受消息。
networkConnector可用配置:
1:name:默認是bridge
2: dynamicOnly: 默認是false,如果爲true, 持久訂閱被激活時才創建對應的網路持久訂閱。默認是啓動時激活
3:decreaseNetworkConsumerPriority:默認是false。設定消費者優先權,如果爲true,網絡的消費者優先級降低爲-5。 如果爲false,則默認跟本地消費者一樣爲0
4:networkTTL :默認是1 ,網絡中用於消息和訂閱消費的broker數量
5:messageTTL :默認是1 ,網絡中用於消息的broker數量
6:consumerTTL:默認是1 ,網絡中用於消費的broker數量
7:conduitSubscriptions :默認true,是否把同一個broker的多個consumer當做一個來處理
8:dynamicallyIncludedDestinations :默認爲空,要包括的動態消息地址,類似於excludedDestinations,如:
<dynamicallyIncludedDestinations>
<!-- 需要過濾的消息名稱 -->
<queue physicalName="include.test.foo"/>
<topic physicalName="include.test.bar"/>
</dynamicallyIncludedDestinations>
9:staticallyIncludedDestinations :默認爲空,要包括的靜態消息地址。類似於excludedDestinations,如:
<staticallyIncludedDestinations>
<queue physicalName="always.include.queue"/>
</staticallyIncludedDestinations>
當我們不希望brokerA的所有消息都發送到brokerB上,可以選擇配置此項
10:excludedDestinations :默認爲空,指定排除的地址,示例如下:
<networkConnectors>
<networkConnector uri="static://(tcp://localhost:61616)" 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>
11:duplex :默認false,設置是否能雙向通信
12:prefetchSize :默認是1000,持有的未確認的最大消息數量,必須大於0,因爲網絡消費者不能自己輪詢消息
13:suppressDuplicateQueueSubscriptions:默認false,如果爲true, 重複的訂閱關係一產生即被阻止
14:bridgeTempDestinations :默認true,是否廣播advisory messages來創建臨時destination
15:alwaysSyncSend(同步) :默認false,如果爲true,非持久化消息也將使用request/reply方式代替oneway方式發送到遠程broker。
16:staticBridge :默認false,如果爲true,只有staticallyIncludedDestinations中配置的destination可以被處理。
17:dynamicOnly:默認是false,如果爲true, 持久訂閱被激活時才創建對應的網路持久訂閱。默認是啓動時激活
消息的迴流功能:
有這樣的場景,brokerA 和brokerB通過networkGonnector連接,一些consumers 連接到brokerB ,消費brokerA_上的消息。消息先被brokerB從brokerA_上消費掉,然後轉發給這些consumers.不幸的是轉發部分消息的時候brokerB重啓了,這些consumers發現brokerB連接失敗,通過failover連接到brokerA上去了,但是有一部分他們還沒有消費的消息被brokerA已經分發到了brokerB上去了。這些消息,就好像是消失了,除非有消費者重新連接到brokerB上來消費。即使配置成雙向鏈接,還是會有一部分數據接收不到,只有從新連接brokerB纔可以。雙向連接會在開始的時候分配兩邊接收的消息數量。
從5.6版起,在destinationPolicy上新增的選項replayWhenNoConsumers。這個選項使得brokerB上有需要轉發的消息但是沒有消費者時,把消息迴流到它原始的brokerA. 同時把enableAudit設置爲false,爲了防止消息迴流後被當做重複消息而不被分發。需要設置成雙向連接且在兩個broker的activemq.xml裏面配置如下信息:
<destinationPolicy>
<policyMap>
<policyEntries>
<policyEntrytopic=">" enableAudit="false">
<networkBridgeFilterFactory>
<conditionalNetworkBridgeFilterFactoryreplayWhenNoConsumers="true" />
</networkBridgeFilterFactory>
</policyEntry>
</policyEntries>
</policyMap>
</destinationPolicy>
連接的容錯:
Fai lover Protocol:
前面講述的都是Client配置鏈接到指定的broker上。但是,如果Broker的鏈接失敗怎麼辦呢?此時,Client有兩個選項:要麼立刻死掉,要麼去連接到其它的broker上。
Failover協議實現了自動重新鏈接的邏輯。這裏有兩種方式提供了穩定的brokers列表對於Client鏈接。第一種方式:提供一個static的可用的Brokers列表。第二種方式:提供一個dynamic發現的可用Brokers。
Failover Protocol的默認配置:
默認的情況下,這種協議用於隨機的去選擇一個鏈接去連接,如果連接失敗了,那麼會連接到其他的Broker上。默認配置定義了延遲重新連接,意味着傳輸將會在10s後自動去重新連接可用的broker.當然所以有的重新連接參數都可以根據應用的需要而配置的。
Failover Protocol 使用示例:
ConnectionFactory activeMQConnectionFactory = new ActiveMQConnectionFactory("failover:(tcp://192.168.100.155:61616,tcp://192.168.100.155:61626)?randomize=fase");
當發送消息的時候,第一次有可能會發送給brokerA,當把brokerA kill掉之後。再次發送消息的時候,就會發送給brokerB。這其實是一種容錯機制。當randomize=true這樣設置消息就會出現一種負載均衡。隨機發送給不同的broker。可以保證既能容錯也能有負載均衡。
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.
- trackMessages: 設置是否緩存(故障發生時)尚未傳送完成的消息,當broker一旦重新連接成功,便將這些緩存中的消息刷新到新連接的代理中,使得消息可以在broker切換前後順利傳送。默認false
- maxCacheSize: 當trackMessage啓動時,緩存的最大子接,默認爲127*1024bytes
- updateURISupported:設定是否可以動態修改broker uri(自5.4版本開始),默認true.
官方集羣文檔:
http://activemq.apache.org/masterslave.html