構造SUN Message Queue集羣,提供高可用性消息服務

 

本文轉自:JAVA技術

作者:Carol Zhang, Sun Microsystems

本文將介紹SUN提供的基於JMS的企業級產品SUN Java System Message Queue,並重點講解怎樣構造SUN Message Queue的集羣,爲企業級的應用提供高可用性和高擴展性的消息服務。


Message Queue

Message Queue適合於在分佈式企業應用之中實現可靠的異步消息通信。JMS是基於JAVA的實現消息通信的開放標準,是用JAVA實現的“消息中間件”。
 

Sun Java System Message Queue

Sun Java System Message Queue 提供功能全面的消息服務,符合 Java Messaging Specification (JMS) 1.1 規範的的可靠、異步的消息傳送功能。此外,Message Queue 還提供 JMS 規範之外的許多功能,以滿足大型企業部署的需要。
目前最新的版本是Sun Java™ System Message Queue 3 2005Q4 (3.6 SP3),支持Solaris,Linux和Windows平臺。SUN Message Queue可以免費的下載和使用。
 

Message Queue Cluster

在大型企業部署的應用中下,系統必須提供高可用性和可擴展性。這往往是通過服務器的集羣實現。Sun Message Queue支持Broker Cluster,即一組broker,作爲一個邏輯的整體,給客戶提供消息傳送服務。Cluster通過在多個broker之間均衡分佈來自客戶端的連接,從而達到負載均衡的目的。在系統需要處理大量的消息,有可能超過單個broker的負荷時,MQ Cluster是很好的選擇。
下圖是Sun Message Queue Cluster的原理圖:

SetupM1.gif

從圖中可以看出:
 

  1. 多個Broker實例之間組成集羣,其中有,且只有一個Master Broker,它維護着“Configuration Change Record”,記錄了Destination 和durable subscription,這些記錄被其它的Broker 用來恢復其失效期間發生的變化。
  2. Broker之間的同步:在Broker的環境中,Broker之間要同步“destination”,“Message Consumer”的信息。
  3. 每個Client端都直接連接着一個Broker,我們稱之爲“Home Broker”。“Home Broker”負責本地連接的client(包括producer和consumer)的操作,以及與remote broker之間的消息傳送。
  4. 可以推論出,Broker之間的traffic可能是非常多的。它們包括Broker之間的同步,爲連接在remote broker上的consumer傳送消息等。Sun MQ爲最小化這些網絡traffic做了很多優化,以減小網絡開銷。

創建Sun Message Queue Cluster

Mq的缺省安裝的實例使用7676端口。本示例中描述了在Solaris環境下,怎樣創建由缺省實例作爲Master,和在本機不同端口運行的MQ實例組成的集羣。類似的步驟可以運用於其它的分佈式環境。

1. 在本機的不同端口創建另外一個MQ實例

  1. 在目錄/var/imq/instances下 創建實例目錄, 例如. “imqbroker_1”
  2. 編輯 /var/imq/instances/<instance>/props/config.properties file, 使imq.cluster.url 屬性指向將在第三步創建的集羣屬性文件所在的路徑,例如:imq.cluster.url=file:/export/home/config/mq/cluster.properties
  3. 選擇一個未被使用的端口,賦值於imq.portmapper.port屬性,例如:imq.portmapper.port=7686
     

2. 創建集羣屬性文件
 

imq.cluster.brokerlist=localhost:7676,localhost:7686
imq.cluster.masterbroker=localhost:7676
imq.cluster.url=file:/export/home/config/mq/cluster.properties
imq.cluster.transport=tcp

將這個文件保存在 imq.cluster.url 指向的路徑


3. 啓動實例:imqbrokerd –name <instance>, 例如:
 

imqbrokerd -name imqbroker &
imqbrokerd -name imqbroker_1 &

 

4. 如果需要關閉實例,使用:imqcmd shutdown bkr -b <host>:<port> 例如:
 

imqcmd shutdown bkr -b localhost:7676
 

5. 測試集羣
 

啓動管理控制檯,觀察兩個broker的destination的同步情況。
命令行運行 #imqadmin

SetupM2.jpg

如上圖所示,管理控制檯建立了跟兩個broker的連接,這兩個broker已經組成了cluster。當用戶在其中一個broker上建立一個 destination的時候,可以發現這個destination能同步到另外一個broker上去,這就說明cluster創建成功了。
 

開發客戶端


本節描述對於SUN Mq的Cluster,客戶端的編程如何利用到Cluster實現負載均衡。客戶端編程要點是,用於創建與Broker連接的“連接工廠”對象必須用Broker的地址列表初始化。有兩種方式得到“連接工廠”對象:
 

1.使用JNDI查詢
 

我們以在SUN Java System Application Server 8.1中添加工廠對象爲例,將QueueConnectionFactory 對象綁定到jndi tree,並在屬性編輯列表中添加屬性“AddressList”,其值爲 “mq://localhost:7676/, mq://localhost:7686/”. 

2.直接實例化工廠對象
 

import com.sun.messaging.*;
myQConnFactory = new com.sun.messaging.QueueConnectionFactory();
myQConnFactory.setProperty(ConnectionConfiguration.imqAddressList, "localhost:7676,localhost:7686");
myQConnFactory.setProperty(ConnectionConfiguration.imqAddressListBehavior, "RANDOM");


當編譯運行時,將imqlibjms.jar, imqlibimq.jar 加入到classpath。
 

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