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>