ActiveMQ學習筆記02 - 多服務器間的通訊

ActiveMQ支持多服務器(Broker)之間的網絡鏈接,也就是集羣。經過集羣多個ActiveMQ Broker的實例,提供一個對外的統一服務,用來提升ActiveMQ的可用性和擴展性。java

服務器之間的通訊,按照通訊方式能夠分爲兩種,橋接轉發(Bridge Forwarding)和雙向傳輸(duplex)。顧名思義,橋接轉發是將消息傳遞給另一個ActiveMQ的Broker,雙向傳輸是用一個通道既能夠收消息,也能夠發消息。算法


按照發現Broker的方式來區分,也能夠分紅另外兩種,靜態註冊和動態發現。若是你確切的知道每一臺Broker的地址和端口號,那麼可使用靜態註冊的方式;若是你並不知道每一臺Broker的狀況,好比,一個可動態擴展的生產環境,那麼動態發現方式將很是合適。apache

每一種通訊方式,一樣是經過編輯%ACTIVEMQ_HOME%conf\activemq.xml文件來完成配置。以下:服務器

<networkConnectors>
    <networkConnector name="default-nc" uri="multicast://default"/> 
</networkConnectors>

在networkConnectors的節點下能夠配置多個networkConnector,每一個networkConnector是一種Broker-to-Broker的通訊方式。下面具體介紹一下ActiveMQ支持的Broker-to-Broker的幾種協議。網絡

靜態註冊:運維

服務器端的Static Connector:被設置爲Static Connector的兩個Broker之間會轉發消息,發給BrokerA的消息,會轉發給BrokerB。但不是實時轉發,而是在Consumer訪問BrokerB的時候再轉發。配置以下:dom

<broker xmlns="http://activemq.apache.org/schema/core" brokerName="BrokerB" dataDirectory="${activemq.base}/data">
    <transportConnectors>
        <transportConnector name="openwire" uri="tcp://localhost:61616" /> 
    </transportConnectors> 
    <networkConnectors>
        <networkConnector uri="static:(tcp://remotehost:61616)" /> 
    </networkConnectors>
</broker>

這樣,發給remotehost的消息,會在Consumer從localhost中取消息的時候自動轉發過去。tcp


Static Connector比較適合用在須要分散Consumer鏈接的場景。好比:有一個Broker有不少Consumer,並且每一個Consumer在不一樣的地區。若是每一個Consumer都鏈接同一個Broker,那麼這個Broker將維護大量的鏈接,若是每一個地區一個Broker,則每一個地區的Consumer只須要鏈接本地的Broker。Broker之間經過Static自動轉發消息,能夠緩解單臺Broker鏈接過多的問題。測試

在實際測試的時候發現了《ActiveMQ in Action》書中有一點沒寫清楚。只有Queue纔是Consumer消費的時候轉發消息。持久化Topic是同步轉發消息的,而且remotehost上面的消息都會被標記爲已消費。url

客戶端的Failover Protocol:顧名思義,個協議是失效轉移。客戶端會默認使用隨機算法選擇事先配置好的幾個Broker之一;也能夠關閉隨機選擇。若是被選中的Broker發生情況,致使不能提供服務,客戶端會選擇另外一個可用的Broker,若是某個Broker不可用,ActiveMQ會無限制的重試。(每次鏈接重試的延遲時間可配置)

默認配置,使用隨機選擇Broker算法:

failover:(tcp://localhost:61616,tcp://remotehost:61616)

關閉隨機選擇,優先選擇第一個配置的Broker,只有以前的Broker不可用,再選擇後面Broker

failover:(tcp://localhost:61616,tcp://remotehost:61616)?randomize=false"

因爲自動重連機制,因此強烈推薦客戶端使用faliover,即便是隻有一個Broker,也能夠經過自動重連功能,在Broker從新啓動以後從新建立鏈接,而不用手動重啓客戶端。這樣能夠提高程序的健壯性。

注意這個failover和static是不一樣的,static鏈接是用於服務器端自動轉移消息,客戶端並不知道服務器端是怎麼轉移消息的,也不知道到底服務器是幾個,對客戶端是徹底透明的。failover是客戶端失效轉移,客戶端鏈接服務器的的url須要明確的指出,因此客戶端必須知道服務器端的網絡拓撲結構。

動態發現:

服務器端的Multicast Connector:服務器之間經過廣播功能自動發現其餘服務器。每一個服務器都會把本身的服務發佈給224.0.0.0 - 239.255.255.255 IP地址段,也會從這個地址段找尋其餘服務器。這樣多個服務器之間能夠主動的相互發現。配置以下:

<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>

在networkConnectors節點中配置multicast協議,用於尋找其餘支持multicast的服務器。在transportConnector節點配置discoveryUri,聲明服務器自己支持multicast協議。

廣播自動發現服務器,適合於常常動態增減服務器的狀況。優勢是增減服務器,不須要爲每一個其餘服務器節點修改配置。缺點是服務自動發現,缺乏配置文件,對調試有影響。另外須要注意的是,因爲廣播功能,常常產生大量的消息傳輸,因此不少狀況下運維是關掉這個服務的。使用Multicast Connector前要確保這個服務是開啓的。

客戶端的Discover Protocol:和Failover Protocol差很少,只不過是動態發現服務。配置以下

discovery:(multicast://default)

這樣客戶端會自動鏈接廣播的url在multicast://default的服務器。

客戶端的Fanout Protocol:扇出協議,用於一個客戶端同時向多個服務器發一樣的消息。

靜態查找配置以下:

fanout:(static:(tcp://host1:61616,tcp://host2:61616,tcp://host3:61616))

固然也能夠支持動態發現:

fanout:(multicast://default)

這個適用場景不多,畢竟客戶端直接控制發冗餘消息給服務器,實際上將變得更加不可控,不建議使用。

客戶端的Peer Protocol:對等協議,用於前嵌入式服務器的鏈接,使用場景較少。

相關文章
相關標籤/搜索