Message Queue 支援使用代理程式叢集,也就是會共同協作,向用戶端提供訊息傳送服務的代理程式群組。叢集可使管理員透過分發數個代理程式間的用戶端連線,根據訊息流量來調整訊息傳送作業。
本章說明代理程式叢集的架構和內部功能。涵蓋下列主題:
請注意,代理程式叢集提供服務可用性,但不提供資料可用性。如果叢集中的代理程式失敗,連線至該代理程式的用戶端可以重新連線到叢集中的其他代理程式,但是在重新連線到替代代理程式時,部分資料可能會遺失。
圖 4–1 顯示代理程式叢集的 Message Queue 架構。叢集中的每個代理程式會直接連線到其他所有代理程式。每個用戶端 (訊息產生器或用戶) 都擁有單獨的本機代理程式,藉以直接通訊,進行傳送和接收訊息,就好像此代理程式是叢集中唯一的代理程式一樣。事實上,本機代理程式與其他代理程式一起合作,為所有連線的用戶端提供傳送服務。
在叢集中,服務可用性取決於代理程式是否能夠共用目標與長期訂閱者的資訊。如果叢集代理程式失敗,此狀態資訊有可能會不同步。為防止出現這種可能情況,可以將叢集內的某個代理程式指定為主代理程式。主代理程式會維護配置變更記錄,以追蹤對叢集的永久性實體 (目標與長期訂閱) 所作的變更。此記錄可用以傳播此類變更資訊至變更發生時離線的代理程式。
下列各節說明如何在叢集中執行訊息傳送,以及如何配置和同步化代理程式 (即使一或多個代理程式處於離線狀態)。
在叢集配置中,代理程式會共用目標與訊息用戶的資訊;每個代理程式均瞭解下列資訊:
叢集中所有實體目標的名稱、類型和屬性
每個訊息用戶的名稱、位置和偏好
上述資訊的更新 (刪除、增加或重新配置)
這可讓每個代理程式從其本身直接連線的訊息產生器,路由訊息到遠端訊息用戶。產生器的本機代理程式與用戶的本機代理程式有不同的職責:
產生器的本機代理程式負責保留及路由來自該產生器的訊息,記錄、管理作業事件,並且處理來自使用用戶端的確認。
用戶的本機代理程式負責保留用戶相關的資訊、轉寄訊息至用戶,並且讓產生器的代理程式瞭解用戶是否仍然可用,以及訊息是否成功使用。
叢集代理程式會一同作業,將叢集內的訊息流量降到最低;例如,如果遠端代理程式針對相同的主題目標有兩個完全一樣的訂閱,則訊息只會經由線路傳送一次。您可以設定目標特性,指定傳送至本機用戶優先於傳送至遠端用戶,以進一步減少流量。
如果用戶端與代理程式之間需要安全且加密的訊息傳送,可以配置叢集以提供代理程式之間安全的訊息傳送。
針對叢集代理程式上實體目標所設定的屬性,可以套用到叢集中該目標的所有實例;但是這些屬性指定的部分限制會套用到整個叢集,而其他限制則會套用到個別目標實例。表 4–1 列出您可以為實體目標設定的屬性,並指定屬性範圍。
表 4–1 叢集代理程式上實體目標的特性
特性名稱 |
範圍 |
---|---|
maxNumMsgs |
每個代理程式。因此,藉由在叢集中分發產生器,可讓您提高未使用訊息的限制總量。 |
maxTotalMsgBytes |
每個代理程式。因此,藉由在叢集中分發產生器,可讓您提高為未使用訊息所保留的記憶體限制總量。 |
lmitBehavior |
全域 |
maxBytesPerMsg |
每個代理程式 |
maxNumProducers |
每個代理程式 |
maxNumActiveConsumers |
全域 |
maxNumBackupConsumers |
全域 |
consumerFlowLimit |
全域 |
localDeliveryPreferred |
全域 |
isLocalOnly |
全域 |
useDMQ |
每個代理程式 |
不論目標是由管理員所建立、自動建立或是暫時建立,都會影響目標在叢集中傳播的方式,以及在連線失敗或代理程式失敗時處理目標的方式。下列幾節說明幾種使用狀況,以判斷建立目標的時機和複製目標的方式。其中包括:
下圖顯示在用戶端產生至佇列並使用回覆發送模型時,目標的建立和複製方式。
管理員會建立實體目標 QW。在建立叢集期間,佇列會複製到整個叢集。
產生器 ProdQW 傳送訊息到佇列 QW,並使用回覆發送模型,引導回覆到暫時佇列 TempQ1W。(暫時佇列會在應用程式建立暫時目標並增加用戶時,建立並複製。)
本機代理程式 BrokerW 保留傳送到 QW 的訊息,並將該訊息路由到第一個符合此訊息選取條件的使用中用戶。訊息會傳送到用戶 C1QW (在 BrokerX 上) 或用戶 C2QW (在 BrokerY上),這需視哪個用戶已備妥接收訊息而定。接收訊息的用戶會傳送回覆到目標 TempQ1W。
下圖顯示在產生器將訊息傳送到不存在而需要自動建立的目標時,建立和複製目標的方式。
產生器 ProdAutoQY 會將訊息傳送到目標 AutoQY,但是代理程式上不存在該目標。
代理程式會保留訊息,並建立目標 AutoQY。
自動建立的目標不會自動複製到整個叢集。只有當用戶選擇接收佇列 AutoQY 的訊息時,該用戶的本機代理程式才會建立目標 AutoQY,並傳送訊息到用戶。自動建立的目標會在用戶建立它的位置複製到整個叢集。在此範例中,當用戶 CAutoQY 建立目標時,複製便開始進行。
下圖顯示在用戶端將訊息發佈到管理員建立的主題目標時,在叢集中建立和複製目標的方式。
管理員會建立實體主題目標 TY。管理員建立的目標 TY 會複製到整個代理程式叢集 (在使用目標之前)。
發佈者 PubTY 將訊息傳送到主題 TY。
本機代理程式 BrokerY 保留發佈到 TY 的任何訊息,並將訊息路由到符合此訊息選取條件的所有主題訂閱者。在此範例中,C1TY 和 C2TY 訂閱主題 TY。
表 4–2 說明不同類型的目標如何在叢集中進行複製與刪除。
表 4–2 處理叢集中的目標
若要在啟動時建立叢集中代理程式之間的連線,各個代理程式都必須收到其他所有代理程式的主機名稱與連接埠號 (包括主代理程式,如果存在)。此資訊由一組叢集配置特性指定,而叢集中所有代理程式的這些特性都應該相同。雖然可以為每個代理程式個別指定配置特性,但這種方法易產生錯誤並容易導致叢集配置的不一致性。因此,建議您將所有配置特性集中置於啟動時各代理程式均參照的叢集配置檔案。這樣可確保所有代理程式共用相同的配置資訊。
如需有關叢集配置特性的詳細資訊,請參閱「Sun Java System Message Queue 3.7 UR1 管理指南」中的「叢集配置特性」。
雖然叢集配置檔案原本是用於配置叢集,但是也方便用於儲存叢集中所有代理程式共用的其他特性。
叢集的配置只要有所變更,有關變更的資訊都會自動傳播到叢集中的所有代理程式。發生下列情況之一時,叢集配置會有所變更:
建立或銷毀叢集中某個代理程式上的目標。
目標的特性已變更。
訊息用戶以其本機代理程式註冊。
訊息用戶與其本機代理程式中斷連線 (不論是明確中斷連線,還是因為用戶端、代理程式或網路故障而中斷連線)。
訊息用戶會建立主題的長期訂閱。
這類變更資訊將立即傳播至發生變更時叢集內所有線上的代理程式。然而離線的代理程式 (例如當機的代理程式) 不會在發生變更時收到通知。考量到離線的代理程式,Message Queue 會為叢集維護配置變更記錄,其中記錄所有已建立或銷毀的永久性實體 (目標與長期訂閱)。離線的代理程式回復到線上狀態時 (或者在新的代理程式加入叢集中時),該代理程式會參考此記錄,以取得關於目標與長期訂閱者的資訊,然後與其他代理程式交換目前使用中的訊息用戶相關資訊。
叢集中的一個代理程式會指定為主代理程式,負責維護配置變更記錄。因為其他代理程式無法在沒有主代理程式的情況下完成初始化,所以主代理程式務必是叢集中首先啟動的代理程式。如果主代理程式離線,則配置資訊將無法在叢集中傳播,因為其他代理程式無法存取配置變更記錄。在這些情況下,如果您嘗試建立、重新配置或銷毀目標或長期訂閱,或嘗試執行如重新啟動長期訂閱等相關作業,則會出現異常。(但是非管理訊息的傳送仍會繼續正常作業。) 使用主代理程式和配置變更記錄是選擇性的。如果您擔心叢集配置變更或代理程式失敗之後叢集無法同步,才會需要主代理程式和配置變更記錄。