程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> JAVA編程 >> JAVA綜合教程 >> ActiveMQ筆記(3):基於Networks of Brokers的HA方案,activemqbrokers

ActiveMQ筆記(3):基於Networks of Brokers的HA方案,activemqbrokers

編輯:JAVA綜合教程

ActiveMQ筆記(3):基於Networks of Brokers的HA方案,activemqbrokers


上一篇介紹了基於ZK的ActiveMQ HA方案,雖然理解起來比較容易,但是有二個不足:

1)  占用的節點數過多,1個zk集群至少3個節點,1個activemq集群也至少得3個節點,但其實正常運行時,只有一個master節點在對外響應,換句話說,花6個節點的成本只為了保證1個activemq master節點的高可用,太浪費資源了。

2)  性能下降太明顯,比起單節點的activemq,性能下降了近1個數量級。

這一篇將介紹基於networks of brokers的HA方案,不需要借助zk等第3方組件,只需要2個activemq節點就能達到類似效果,進入正題之前,先來簡單談談Broker這個概念。

Broker一詞的原意是『經紀人、中間人』,用在ActiveMQ的構架中,即:Broker作為Producer與Consumer的中間人(或代理人),生產者不用知道消費者在哪裡、如何消費這些細節,只要將消息扔給中間人Broker即可,類似的,消費者也不用關心消息是從哪個生產者過來的,它只知道這是從Broker那裡拿來的,如果畫一張圖來描述,就是下面這樣(引用自本文最後參考文章中的圖片)

 

那麼,當生產者將消息發給Broker時,會發生什麼?下圖描述的就是這個過程:

1) 生產者將消息發給Broker

2) Broker將消息落地存儲

3) 然後給生產者反饋:事情我已經辦妥了!

繼續,再來看看消費者又是如何跟Broker打交道的:

1) Broker將接收到的消息,從db中取出

2) 然後發送給消費者

3) 如果消費者使用的是自動確認模式(即:Session.AUTO_ACKNOWLEDGE),則Consumer會馬上告訴Broker:ok,消息我已經收到了。

4) 然後進行自己的業務處理

5) Broker一旦收到確認,將會馬上更新消息的狀態為已消費(或直接刪除,取決於持久化的實現機制)(注:雖然圖中步驟5排在步驟4之後,但是步驟4、5幾乎是同時發生的)

在一些大型應用中,如果一個Broker出現性能瓶頸抗不住壓力,可能會拆分成多個Broker,如下圖所示:

(注:上圖中箭頭的方法並非數據流向,而應該理解成調用關系,即:Producer調用Broker1,Consumer調用Broker2...)

Producer將消息發送給Broker1,而Consumer從另一個Broker2接收消息,有點類似數據庫讀寫分離的意思,這樣系統的性能可以提升一定程度的提升,但是問題來了,Broker1上的消息,如何同步到Broker2呢,這就依賴networkConnector的配置。

1 <beans 2 xmlns="http://www.springframework.org/schema/beans" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4 xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd 5 http://activemq.apache.org/schema/core http://activemq.apache.org/schema/core/activemq-core.xsd"> 6 7 <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> 8 <property name="locations"> 9 <value>file:${activemq.conf}/credentials.properties</value> 10 </property> 11 </bean> 12 13 <broker xmlns="http://activemq.apache.org/schema/core" brokerName="activemq-1"> 14 <networkConnectors> 15 <networkConnector uri="static:(tcp://127.0.0.1:61626)"/> 16 </networkConnectors> 17 <persistenceAdapter> 18 <kahaDB directory="${activemq.data}/kahadb"/> 19 </persistenceAdapter> 20 <transportConnectors> 21 <transportConnector name="openwire" 22 uri="tcp://0.0.0.0:61616?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/> 23 </transportConnectors> 24 </broker> 25 26 <import resource="jetty.xml"/> 27 </beans> View Code

注意:14-16行及21-22行,該Broker對外暴露61616端口,同時"連接"到61626端口(即另1個broker),最終的效果相當於,如果有producer把消息發到61616(broker1),則從另一個broker(61626端口)上也能消費這條消息。

明白這些基本原理後,在61626對應的activemq上,也做類似的配置,只不過"連接方向"正好相反,參考以下配置:

1 <beans 2 xmlns="http://www.springframework.org/schema/beans" 3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 4 xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd 5 http://activemq.apache.org/schema/core http://activemq.apache.org/schema/core/activemq-core.xsd"> 6 7 <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> 8 <property name="locations"> 9 <value>file:${activemq.conf}/credentials.properties</value> 10 </property> 11 </bean> 12 13 <broker xmlns="http://activemq.apache.org/schema/core" brokerName="activemq-2"> 14 <networkConnectors> 15 <networkConnector uri="static:(tcp://127.0.0.1:61616)"/> 16 </networkConnectors> 17 <persistenceAdapter> 18 <kahaDB directory="${activemq.data}/kahadb"/> 19 </persistenceAdapter> 20 <transportConnectors> 21 <transportConnector name="openwire" 22 uri="tcp://0.0.0.0:61626?maximumConnections=1000&amp;wireFormat.maxFrameSize=104857600"/> 23 </transportConnectors> 24 </broker> 25 26 <import resource="jetty.xml"/> 27 </beans> View Code

(注:如果希望2個activemq上都能訪問admin管理界面,jetty.xml中的端口要修改,不要沖突)

這樣,activemq-1與activemq-2這二個broker就互為主備,發給你的消息會同步到我,發給我的消息也會同步到你,實現了HA,示意圖如下:

Producer與Consumer連接到activemq時,配置文件可以這麼寫:

1 <bean id="jmsFactory" class="org.apache.activemq.pool.PooledConnectionFactory" destroy-method="stop">
2     <property name="connectionFactory">
3         <bean class="org.apache.activemq.ActiveMQConnectionFactory">
4             <!--broker服務的地址-->
5             <property name="brokerURL" value="failover:(tcp://localhost:61616,tcp://localhost:61626)"/>
6             ...
7         </bean>
8     </property>
9 </bean>

這種HA方案的優點是占用的節點數更少(只需要2個節點),而且2個broker都可以響應消息的接收與發送,性能比zookeeper方案要好一些。

 

參考文章:

http://www.jakubkorab.net/2011/11/understanding-activemq-broker-networks.html

http://activemq.apache.org/networks-of-brokers.html

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved