ActiveMQ學習第四篇:ActiveMq僞集羣學習

啓動多實例

# 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&amp;wireFormat.maxFrameSize=104857600"/>
            <transportConnector name="amqp" uri="amqp://0.0.0.0:5622?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>
            <transportConnector name="stomp" uri="stomp://0.0.0.0:61623?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>
            <transportConnector name="mqtt" uri="mqtt://0.0.0.0:1823?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/>
            <transportConnector name="ws" uri="ws://0.0.0.0:61624?maximumConnections=1000&amp;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 可用的配置參數:

  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. trackMessages: 設置是否緩存(故障發生時)尚未傳送完成的消息,當broker一旦重新連接成功,便將這些緩存中的消息刷新到新連接的代理中,使得消息可以在broker切換前後順利傳送。默認false
  10. maxCacheSize: 當trackMessage啓動時,緩存的最大子接,默認爲127*1024bytes
  11. updateURISupported:設定是否可以動態修改broker uri(自5.4版本開始),默認true.

官方集羣文檔:

http://activemq.apache.org/masterslave.html

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章