1. 程式人生 > >ActiveMQ的靜態網路連結

ActiveMQ的靜態網路連結

                                ActiveMQ的靜態網路連結

ActiveMQ的networkConnector是什麼?

在某些場景下,需要多個ActiveMQ的Broker做叢集,那麼就涉及到Broker到Broker的通訊,這個被稱為ActiveMQ的networkConnector。

ActiveMQ的networkConnector預設是單向的,一個Broker在一端傳送訊息,另一Broker在另一端接收訊息。這就是所謂的“橋接”。 ActiveMQ也支援雙向連結,建立一個雙向的通道對於兩個Broker,不僅傳送訊息而且也能從相同的通道來接收訊息,通常作為duplex connector來對映,如下:

“discovery”的概念

一般情況下,discovery是被用來發現遠端的服務,客戶端通常想去發現所有可利用的brokers;另一層意思,它是基於現有的網路Broker去發現其他可用的Brokers。

有兩種配置Client到Broker的連結方式,一種方式:Client通過Statically配置的方式去連線Broker,一種方式:Client通過discovery agents來dynamically的發現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 networkConnector的基本原理示意圖:

上圖中,兩個Brokers是通過一個static的協議來網路連結的。一個Consumer連結到brokerB的一個地址上 ,當Producer在brokerA上以相同的地址傳送訊息時,此時它將被轉移到brokerB上。也就是,BrokerA會轉發訊息到BrokerB上。

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>

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

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可以被處理。

“丟失”的訊息

有這樣的場景,broker1和broker2通過networkConnector連線,一些consumers連線到broker1,消費broker2上的訊息。訊息先被broker1從broker2上消費掉,然後轉發給這些consumers。不幸的是轉發部分訊息的時候broker1重啟了,這些consumers發現broker1連線失敗,通過failover連線到broker2上去了,但是有一部分他們還沒有消費的訊息被broker2已經分發到了broker1上去了。這些訊息,就好像是消失了,除非有消費者重新連線到broker1上來消費。怎麼辦呢?

從5.6版起,在destinationPolicy上新增的選項replayWhenNoConsumers。這個選項使得broker1上有需要轉發的訊息但是沒有消費者時,把訊息迴流到它原始的broker。同時把enableAudit設定為false,為了防止訊息迴流後被當做重複訊息而不被分發,示例如下:

<destinationPolicy>
    <policyMap>
        <policyEntries>
          <policyEntry queue=">" enableAudit="false">
             <networkBridgeFilterFactory>
                  <conditionalNetworkBridgeFilterFactory replayWhenNoConsumers="true"/>
             </networkBridgeFilterFactory>
          </policyEntry>
       </policyEntries>
    </policyMap>
</destinationPolicy>