JBoss AS 3.2.4 和更高的版本支持高可用性的 all 服務器配置裏的 JMS(HA-JMS)服務。在 JBoss AS 當前的發佈版本里,HA-JMS 服務用一個羣集的 singleton fail-over 服務來實現。
注意
如果你希望自己來配置 HA-JMS,你可以在以前的 JBoss AS 版本里讓它運行。我們有一個客戶成功地在 JBoss AS 3.0.7 裏使用 HA-JMS。如果你有更多問題的話,請聯繫 JBoss 支持部門。
JBoss HA-JMS 服務(也就是消息隊列和主題)任何給定時間都只在羣集裏的單節點運行(主節點)。如果這個節點崩潰了,羣集系統簡單地選取另外一節點來運行 JMS 服務(fail-over)。這種設置提供了針對服務器癱瘓的冗餘措施,但並沒有降低 JMS 服務器節點的負載。
注意
雖然你不能夠對 HA-JMS 隊列進行負載平衡(只有一個運行這個隊列的主節點),但是你可以平衡處理隊列裏信息的 MDBs 的負載(參考章節 6.1.3, “負載均衡的HA-JMS MDBs”).
1.6.1.1 服務器端配置
爲了使用 singleton fail-over HA-JMS 服務,你必須在羣集裏的所有節點上配置相同的 JMS 服務。這包括所有和 JMS 相關的 MBeans 以及部署的 JMS 應用程序。
JMS 服務器被設置成在 DefaultDS 裏持久化它的數據。在缺省的情況下,那就是內含的 HSQLDB。然而,在大部分羣集環境裏,所有節點都需要把數據持久化到一個共享數據庫裏。因此,在你啓動羣集 JMS 之前要做的第一件事就是建立一個共享數據庫。你需要做如下的事情:
• 配置DefaultDS來指向你選擇的數據庫服務器。就是用docs/examples/jca 目錄下的xxx-ds.xml文件代替deploy/hsqlsb-ds.xml文件,其中xxx是目標共享數據庫的名字(例如,mysql-ds.xml )。
• 把server/all/deploy-hasingleton/jms 目錄下的hsqldb-jdbc2-service.xml文件用特定數據庫的文件代替。例如,MySQL 的文件就是mysql-jdbc2-service.xml。JBoss AS 發行版本捆綁了一些 RDBMS 的配置文件。它們可以在docs/examples/jms下找到。
注意
你不需要替換server/all/deploy-hasingleton/jms 目錄下的hsqldb-jdbc-state-service.xml 文件。儘管它的名字裏包含 hsql,它適用於所有兼容 SQL92 的數據庫,包括 HSQL,MySQL,SQL Server 和更多數據庫。象我們上面配置的那樣,它自動使用 DefaultDS 來存放數據。
雖然你不能夠對 HA-JMS 隊列進行負載平衡(只有一個運行這個隊列的主節點),但是你可以平衡處理隊列裏信息的 MDBs 的負載(參考章節 6.1.3, “負載均衡的HA-JMS MDBs”).
1.6.1.2 HA-JMS客戶端
客戶和常規的 JMS 客戶在兩個方面有所不同。.
• The HA-JMS 客戶必須獲得 HA-JNDI 裏的 JMS connection factories(缺省端口是1100)。
• 客戶連接必須監控服務器異常(exceptions)。當羣集系統 fail-over 到另外一個主節點時,所有在當前連接上的的客戶端操作都會失敗併產生異常(exceptions)。客戶端必須知道該重新連接。
注意
雖然 HA-JMS 連接工廠(connection factory)知道運行 JMS 服務的當前主節點,但並不存在智能的客戶端攔截器(client side interceptor)。客戶端 stub 只知道固定的主節點,它不能夠依服務器拓撲結構的變化而調整。
1.6.1.3 負載平衡的HA-JMS MDBs
雖然 HA-JMS 隊列(queues)和主題(topics)在同一時間只在單節點上運行,但其他節點上的 MDBs 也能夠接收和處理 HA-JMS 主節點上的信息。這種競爭的情況導致 MDBs 的平衡負載行爲。爲了啓用 MDBs 的平衡負載,你可以指定隊列的 receiver。這個 receiver 記錄哪個節點正在等待信息和信息該按什麼樣的順序來處理。JBoss 提供三個 receiver 的實現(implementations)。
• The org.jboss.mq.server.ReceiversImpl是 HashSet 的缺省實現(implementation)。
• The org.jboss.mq.server.ReceiversImplArrayList 是 ArrayList 的實現。
• The org.jboss.mq.server.ReceiversImplLinkedList 是 LinkedList 的實現。
你可以指定 receiver 實現的類名作爲在每個節點上定義永久 JMS Queue 或 DestinationManager 的 MBean 的一個屬性。爲了獲得最好的負載平衡性能,我們建議你使用 ReceiversImplArrayList 或 ReceiversImplArrayList 實現,因爲 JVM 裏的 HashSet 的實現不是很好。