![]() |
Sun ONE Message Queue, Version 3.0.1 管理員指南 |
本章描述 Sun ONE Message Queue (MQ) 訊息傳送系統,並介紹此系統的主要部分如何共同工作以提供可靠的訊息遞送,這些詳細說明的主要部分如圖 2-1 中所示。
圖 2-1    MQ 系統架構
![]()
圖 2-1 中所示的 MQ 訊息傳送系統的主要部分如下:
- MQ 訊息伺服器
- MQ 用戶端運行時間
- MQ 受管理物件
- MQ 管理
前三個部分將在以下各節中詳細說明。最後一個部分將在第 3 章「MQ 管理」中介紹。
MQ 訊息伺服器
本節描述圖 2-1 中所示的 MQ 訊息伺服器的不同部分。這些部分包括:
代理程式 MQ 代理程式為 MQ 訊息傳送系統提供遞送服務。訊息遞送依賴一些支援元件,這些元件可處理連線服務、訊息路由與遞送、持續性、安全性以及記錄 (請參閱代理程式以獲得更多資訊)。訊息伺服器可使用一個或多個代理程式實例 (請參閱多重代理程式叢集 (企業版))。
實體目標 訊息遞送過程分為兩個階段 從生產用戶端遞送至由代理程式維護的實體目標,然後從目標遞送至一個或多個使用用戶端。實體目標表示在代理程式的實體記憶體和/或永久性儲存體中的位置 (請參閱實體目標以獲得更多資訊)。
代理程式
MQ 訊息傳送系統中的訊息遞送 從生產用戶端至目標,然後從目標至一個或多個使用用戶端 由代理程式 (或以串聯方式工作的代理程式實例叢集) 執行。若要執行訊息遞送,代理程式必須設定與用戶端通訊的通道、執行認證與授權、適當路由訊息、確保可靠遞送,並為監視系統效能提供資料。
若要執行這套複雜的功能,代理程式將使用一些不同的元件,並且每個元件在遞送過程中都有特定的作用。根據載入條件、應用程式的複雜性等,您可以配置這些內部元件,以最適化代理程式的效能。圖 2-2 中說明主代理程式元件,表格 2-1 中則簡單描述這些元件。
圖 2-2    代理程式元件
![]()
以下各節更全面地探究不同的代理程式元件所執行的功能,以及可配置為影響元件運作方式的屬性。
連線服務
MQ 代理程式支援與 JMS 用戶端和 MQ 管理用戶端的通訊 (請參閱 MQ 管理工具)。每種服務均由其服務類型和協定類型指定。
服務類型 指定此服務提供 JMS 訊息遞送 (NORMAL) 或提供 MQ 管理 (ADMIN) 服務。
目前,MQ 代理程式可提供的連線服務如表格 2-2 中所示:
您可以將代理程式配置為執行這些連線服務的任何一種或全部。每種服務均有執行緒儲存區管理程式,並使用共用連接埠對映器服務註冊自己,如圖 2-3 中所示。
圖 2-3    連線服務支援
![]()
每種連線服務可用於特定的連接埠,此連接埠由代理程式的主機名稱和連接埠號指定。連接埠可靜態或動態配置。MQ 提供的連接埠對映器可將已動態配置的連接埠對映至不同的連線服務。連接埠對映器本身常駐在標準的連接埠號 7676 上。當用戶端設定與代理程式的連線時,它先聯絡連接埠對映器,以請求其所需的連線服務的連接埠號。
當配置 jms、ssljms、admin 和 ssladmin 連線服務時,您還可以為它們指定靜態連接埠號,但不建議這樣做。使用附錄 B「HTTP/HTTPS 支援 (企業版)」的表格 B-1 和表格 B-3 中描述的屬性,可分別配置 httpjms 和 httpsjms 服務。
每種連線服務均為多重執行緒,支援多重連線。這些連線所需的執行緒,在執行緒儲存區管理程式元件所管理的執行緒儲存區中維護。您可以配置此執行緒儲存區管理程式,以設定此執行緒儲存區中所維護的執行緒的最小數量和最大數量。由於連線需要執行緒,因此可將執行緒新增至執行緒儲存區。當超過最小數量時,系統將關閉執行緒 (因為這些執行緒將成為自由執行緒,直至達到最小數量的臨界值),從而節省記憶體資源。您應將此數量變得足夠大,以便不必繼續建立新的執行緒。載入大量連線後,執行緒的數量會增加,直至達到執行緒儲存區的最大數量,然後連線必須等待,直至某執行緒變為可用。
執行緒儲存區中的執行緒可專屬於單一連線 (專屬模型),或依需要指定給多重連線 (共用模型)。
專屬模型 在專屬模型中,與代理程式的每條連線均需要兩個執行緒:一個專屬於處理進來的訊息,另一個專屬於處理外送的訊息。這可將連線數量限制為執行緒儲存區中最大執行緒數量的一半,但它可提供高效能。
共用模型 (企業版) 在共用執行緒模型中,僅當傳送或接收訊息時才將連線指定給執行緒。這種連線共用執行緒的模型會增加連線服務 (和代理程式) 可支援的連線數量,但也會增加效能耗用時間。執行緒儲存區管理程式使用一套分散執行緒,可監視連線狀態並依需要將連線指定給執行緒。您可以透過限制由每個此類分散執行緒所監視的連線數量來提昇效能。
每種連線服務可支援特定認證和授權 (存取控制) 功能 (請參閱安全性管理程式)。表格 2-3 中顯示與連線服務相關的可配置屬性。(如需有關配置這些屬性的說明,請參閱第 5 章「啟動與配置代理程式」。)
表格 2-3    連線服務屬性
屬性名稱
描述
imq.service.activelist
要在啟動代理程式時變為作用中的連線服務的清單,這些連線服務依名稱列出並以逗號分隔。支援的服務為:jms、ssljms、httpjms、httpsjms、admin 和 ssladmin。預設:jms 和 admin
imq.service_name.
min_threads
指定執行緒數量,一旦達到指定數量,執行緒便會在執行緒儲存區中維護,供已命名的連線服務使用。預設:取決於連線服務 (請參閱表格 5-1)。
imq.service_name.
max_threads
指定執行緒數量,一旦超過指定數量,系統便不會將新的執行緒新增至執行緒儲存區,供已命名的連線服務使用。此數量必須大於零,並且其值必須大於 min_threads 的值。預設:取決於連線服務 (請參閱表格 5-1)。
imq.service_name.
threadpool_model
指定執行緒是專屬於連線 (dedicated) 或依需要由連線共用 (shared),以用於已命名的連線服務。共用模型 (執行緒儲存區管理) 會增加代理程式所支援的連線數量,但僅實施用於 jms 和 admin 連線服務。預設:取決於連線服務 (請參閱表格 5-1)。
imq.shared.
connectionMonitor_limit
僅用於共用執行緒儲存區模型,指定可由分散執行緒監視的最大連線數量。(系統配置了足夠的分散執行緒以監視所有連線。) 此值越小,系統將作用中的連線指定給執行緒的速度就越快。值 0 表示沒有限制。預設:取決於作業系統 (請參閱表格 5-1)。
imq.portmapper.port
代理程式的主要連接埠,即連接埠對映器常駐的連接埠。如果您要在主機上執行多個代理程式實例,則必須為每個實例指定唯一的連接埠對映器連接埠。預設:7676
imq.service_name.
protocol_type1.port
僅用於 jms、ssljms、admin 和 ssladmin 服務,為已命名的連線服務指定連接埠號。預設:0 (連接埠由連接埠對映器動態配置)
若要配置 httpjms 和 httpsjms 連線服務,請參閱附錄 B「HTTP/HTTPS 支援 (企業版)」。
imq.service_name.
protocol_type1.hostname
僅用於 jms、ssljms、admin 和 ssladmin 服務,如果有多台主機可用 (例如,如果一台電腦中有多個網路介面卡),指定已命名的連線服務所連結的主機 (主機名稱或 IP 位址)。
預設:null (任何主機)
1 協定類型在表格 2-2 中指定。 訊息路由器
一旦使用支援的連線服務在用戶端和代理程式之間建立了連線,則可進行訊息路由與遞送。
基本的遞送機制
概括地講,代理程式所處理的訊息分為兩類:由生產者用戶端傳送且目標為使用者用戶端的有效載入 JMS 訊息,以及為了支援 JMS 訊息遞送而向用戶端傳送及從其中發出的一些控制訊息。
如果進來的訊息為 JMS 訊息,則代理程式將基於此訊息的目標類型 (佇列或主題),將其路由至使用者用戶端:
- 如果目標為主題,則 JMS 訊息將立即路由至此主題的所有作用中訂閱者。如果訂閱者為非作用中的持久訂閱者,則訊息路由器將保留此訊息,直至此訂閱者成為作用中訂閱者,然後將此訊息遞送至此訂閱者。
- 如果目標為佇列,則 JMS 訊息將放置在相應的佇列中,然後在此訊息到達佇列前面時被遞送至適當的使用者。訊息到達佇列前面的順序,取決於它們到達的順序及優先順序。
一旦訊息路由器已將訊息遞送至所有預定的使用者,它便會將此訊息從記憶體中清除,如果此訊息為永久性的 (請參閱可靠的訊息傳送),它會將其從代理程式的永久性資料儲存區中移除。
可靠遞送:回應與異動
當為可靠遞送 (請參閱可靠的訊息傳送) 新增需求時,剛才描述的遞送機制會變得更加複雜。可靠遞送包含兩個方面:確保向代理程式傳送及從其中發出的訊息遞送成功,並確保實際遞送訊息之前,代理程式不會遺失訊息或遞送資訊。
為確保訊息成功遞送至代理程式及從其中成功發出,MQ 使用了一些名為回應的控制訊息。
例如,當生產者將 JMS 訊息 (收費載入訊息而不是控制訊息) 傳送至目標時,代理程式會傳送回控制訊息 (即代理程式回應),表明它已接收到此 JMS 訊息。(實際上,僅當生產者指定 JMS 訊息為永久性時,MQ 才執行此作業。) 生產用戶端使用代理程式回應,以確保遞送至目標 (請參閱訊息生產)。
同樣,當代理程式將 JMS 訊息遞送至使用者時,此使用用戶端會傳送回它已接收到並已處理此訊息的回應。建立階段作業物件時,用戶端會指定如何自動或頻繁地傳送這些回應,但原則是,如果訊息路由器沒有從它已向其遞送訊息的每個訊息使用者 (例如,從主題的多重訂閱者的每個訂閱者) 接收到回應,則它不會從記憶體中刪除 JMS 訊息。
如果訂閱者為主題的持久訂閱者,則訊息路由器會將每個 JMS 訊息保留在目標中,並當每個持久訂閱者成為作用中訂閱者時遞送此訊息。訊息路由器接收用戶端回應時會記錄這些回應,並僅在已接收所有回應後才刪除 JMS 訊息 (除非 JMS 訊息在此之前已過期)。
而且,透過將代理程式回應傳送回用戶端,訊息路由器確認用戶端回應的接收。使用用戶端使用代理程式回應,以確保代理程式不會多次遞送同一 JMS 訊息 (請參閱訊息使用)。如果由於某種原因而使代理程式無法接收到用戶端回應,則可能發生上述情況。
如果代理程式沒有接收到用戶端回應並將 JMS 訊息再次遞送,則此訊息會標記有重新遞送旗標。如果用戶端連線在代理程式接收到用戶端回應之前關閉,並隨後開啟新的連線,則此代理程式通常會重新遞送 JMS 訊息。例如,如果佇列的訊息使用者在回應訊息之前離線,而且另一個使用者隨後註冊此佇列,則代理程式將未回應的訊息重新遞送至此新的使用者。
以上描述的用戶端與代理程式回應過程,還適用於群組至異動中的 JMS 訊息遞送。在這些情況下,用戶端與代理程式回應可對異動作業,亦可對傳送或接收的個別 JMS 訊息作業。確定異動時,代理程式回應會被自動傳送。
代理程式追蹤異動,並可在發生故障時對異動進行確定或回轉。本異動管理還支援本機異動,此為較大型分散式異動 (請參閱分散式異動) 的一部分。代理程式追蹤這些異動的狀態,直至它們被確定。代理程式啟動時,它會檢查所有未確定的異動,並依預設,會回轉所有異動 (那些處於 PREPARED 狀態的異動除外)。
可靠遞送:持續性
可靠遞送的另一個方面是,確保實際遞送訊息之前,代理程式不會遺失訊息或遞送資訊。一般來說,訊息會保留在記憶體中,直至它們已被遞送或過期。但是,如果代理程式出現故障,則這些訊息會遺失。
生產者用戶端可指定訊息為永久性的,在此情況下,訊息路由器會將此訊息傳送至將此訊息儲存在資料庫或檔案系統中的持續性管理程式 (請參閱持續性管理程式),以便在代理程式出現故障時回復此訊息。
管理系統資源
代理程式的效能取決於可用的系統資源,以及如何有效利用記憶體之類的資源。例如,訊息路由器具有的記憶體管理機制可監視系統上的記憶體。當記憶體資源不足時,系統會啟動用於回收記憶體以及減慢進來訊息流量的機制。
記憶體管理機制取決於記憶體資源的狀態:green (大量記憶體可用)、yellow (代理程式記憶體正在減少)、orange (代理程式記憶體不足) 以及 red (代理程式無記憶體)。在記憶體資源的狀態從 green 變為 yellow 和 orange,然後變為 red 的過程中,代理程式會採取越來越重要的動作,以回收記憶體並減低訊息生產者的速度,最終使訊息停止流入代理程式。
您可以使用一些屬性配置代理程式的記憶體管理功能,這些屬性可設定記憶體中訊息的總數量和總容量限制,並可在記憶體資源變更至新狀態時調整利用臨界值。
表格 2-4 中詳細介紹了這些屬性。(如需有關設定這些屬性的說明,請參閱第 5 章「啟動與配置代理程式」。)
表格 2-4    訊息路由器屬性
屬性名稱
描述
imq.message.expiration.
interval
指定回收已過期訊息發生的頻率 (以秒為單位)。預設:60
imq.system.max_count
指定記憶體和磁碟 (歸因於交換) 中的最大訊息數量。其他訊息將被拒絕。值 0 表示沒有限制。預設:0
imq.system.max_size
指定記憶體和磁碟 (歸因於交換) 中的最大訊息容量 (以位元組、千位元組或百萬位元組為單位)。其他訊息將被拒絕。值 0 表示沒有限制。預設:0
imq.message.max_size
指定訊息內文的最大允許容量 (以位元組、千位元組或百萬位元組為單位)。大於此容量的任何訊息均將被拒絕。值 0 表示沒有限制。預設:70m (百萬位元組)
imq.resource_state.
threshold
指定啟動每種記憶體狀態時的記憶體利用百分比。資源狀態的值可以為 green、yellow、orange 和 red。預設:分別為 0、60、75 和 90
imq.redelivered.
optimization
每當重新遞送訊息 (true) 時,或僅當邏輯上需要如此操作 (false) 時,指定訊息路由器是否可透過設定重新遞送旗標最適化效能 (true/false)。預設:true
imq.transaction.
autorollback
指定處於 PREPARED 狀態的分散式異動是否可在啟動代理程式時自動回轉 (true/false)。如果為 false,則您必須使用 imqcmd 手動確定或回轉異動 (請參閱管理異動)。預設:false
持續性管理程式
如果要回復的代理程式出現故障,則此代理程式需要重新建立其訊息遞送作業的狀態。此操作要求它將所有永久性訊息以及重要的路由與遞送資訊儲存至資料儲存區。持續性管理程式元件管理此資訊的寫入和擷取。
若要回復發生故障的代理程式,不僅需要簡單地復原未遞送的訊息。代理程式還必須可執行以下作業:
- 重新建立目標
- 復原每個主題的持久訂閱清單
- 復原每個訊息的回應清單
- 重新生產所有已確定異動的狀態
持續性管理程式管理所有此狀態資訊的儲存和擷取。
重新啟動代理程式時,它會重新建立目標和持久訂閱、回復永久性訊息、復原所有異動的狀態,並為未遞送訊息重新建立其路由表格。然後,它可以繼續訊息遞送。
MQ 支援內建和外掛持續性模組 (請參閱圖 2-4)。內建持續性基於文字檔案資料儲存區。外掛持續性使用 Java 資料庫連線 (JDBC) 介面,並需要 JDBC 相容的資料儲存區。內建持續性通常快於外掛持續性;但是某些使用者更喜歡使用了 JDBC 相容資料庫系統的容錯和管理功能。
圖 2-4    持續性管理程式支援
![]()
內建持續性
預設 MQ 永久性儲存體解決方案為文字檔案儲存區。這種方法使用個別檔案儲存永久性資料,如訊息、目標、持久訂閱以及異動。
文字檔案資料儲存區位於:
其中brokerName是識別代理程式實例的名稱。
IMQ_VARHOME/instances/brokerName/filestore/
(在 Solaris 上為 /var/imq/instances/brokerName/filestore/)建立基於檔案的資料儲存區,以便每個永久性訊息均儲存在它們各自的檔案中,即每個檔案儲存一個訊息。但是,目標、持久訂閱和異動則分別儲存在單獨檔案中,即所有目標儲存在一個檔案中,所有持久訂閱儲存在另一個檔案中,等等。
若要建立和刪除檔案,則需要昂貴的檔案系統作業,如同在資料儲存區中新增和刪除訊息。因此,MQ 實施重新使用這些訊息檔案:當不再需要檔案時,系統不是刪除它,而是將它加入自由檔案儲存區以便重新使用。您可以配置此檔案儲存區的容量。您還可以指定此檔案儲存區中被清除的自由檔案的百分比 (截斷至零),而不是僅標記這些檔案以重新使用 (未截斷)。已清除檔案的百分比越高,維護此檔案儲存區所需的磁碟空間就越少,但耗用時間就越多。您還可以指定已標記檔案是否在關機時將被清除。如果這些檔案被清除,則它們將佔用很少的磁碟空間,但關閉代理程式則需較長時間。
文字檔案儲存區中儲存訊息的速度,受可供資料儲存區使用的檔案描述元數量的影響;大量描述元可讓系統更快地處理大量永久性訊息。如需有關增加描述元數量的資訊,請參閱 MQ 版次
注意 事項中的「技術說明」一節。此外,在目標檔案儲存區中,將目標新增至固定容量檔案比新增目標時增加檔案容量更有效。因此,根據您預計目標檔案最終儲存的目標數量 (每個目標約使用 500 位元組),您可以透過設定此目標檔案的原來容量來提昇效能。
由於資料儲存區可包含專用資訊的訊息,因此建議您保護 brokerName/filestore/ 目錄,以防止未經授權的存取。如需說明,請參閱 MQ 版次
注意 事項中的「技術說明」一節。外掛持續性
您可以設定代理程式,以透過 JDBC 驅動程式存取任何可存取的資料儲存區。這包含設定一些與 JDBC 相關的代理程式配置屬性,以及使用資料庫管理員公用程式 (imqdbmgr) 來建立具有適當綱目的資料儲存區。附錄 A「設定外掛持續性」中詳細介紹了這些程序和相關的配置屬性。
表格 2-5 中詳細介紹了與持續性相關的配置屬性。(如需有關設定這些屬性的說明,請參閱第 5 章「啟動與配置代理程式」。)
安全性管理程式
MQ 提供認證與授權 (存取控制) 功能,還支援加密功能。
認證與授權功能依賴使用者儲存庫 (請參閱圖 2-5):包含有關訊息傳送系統使用者的資訊 (如使用者名稱、密碼和群組成員身份) 的檔案、目錄或資料庫。當請求與代理程式連線時,這些名稱和密碼用於認證使用者。使用者名稱和群組成員身份,連同存取控制檔案一起用於授權作業 (如針對目標生產或使用訊息)。
MQ 管理員可移入 MQ 所提供的使用者儲存庫 (請參閱使用文字檔案使用者儲存庫),或將預先存在的 LDAP 使用者儲存庫插入安全性管理程式元件中。文字檔案使用者儲存庫易於使用,但其安全性易受侵害,因此應僅將其用於評估與開發,而 LDAP 使用者儲存庫很安全,因此最適合用於生產。
認證
MQ 安全性支援基於密碼的認證。當用戶端請求連線至代理程式時,它必須提交使用者名稱和密碼。安全性管理程式將此用戶端提交的名稱和密碼與儲存在使用者儲存庫中的名稱和密碼進行比較。將此密碼從用戶端傳送至代理程式時,系統會使用基本 64 編碼或訊息摘要 (MD5) 對密碼進行編碼。如需更加安全的傳送,請參閱加密 (企業版)。您可以分別配置每種連線服務所使用的編碼類型,或在代理程式範圍基礎上設定編碼。
授權
一旦認證用戶端應用程式的使用者,此使用者便可被授權執行各種與 MQ 相關的作業。安全性管理程式支援基於使用者和基於群組的存取控制:根據使用者儲存庫中的使用者名稱或指定給此使用者的群組,此使用者可擁有執行某些 MQ 作業的許可權。您可在存取控制屬性檔案 (請參閱圖 2-5) 中指定這些存取控制。
當使用者嘗試執行作業時,安全性管理程式會檢查使用者名稱和群組成員身份 (從使用者儲存庫) 是否與為存取此作業指定的那些名稱和成員身份 (在存取控制屬性檔案中) 相符。存取控制屬性檔案可指定以下作業的許可權:
- 建立與代理程式的連線
- 存取目標:為任何給定目標或所有目標建立使用者、生產者或佇列瀏覽器
- 自動建立目標
圖 2-5    安全性管理程式支援
![]()
對於 MQ 3.0.1,預設存取控制屬性檔案僅明確參考一個群組:admin (請參閱群組)。admin 群組中的使用者擁有管理服務連線許可權。管理服務可讓使用者執行管理功能,如建立目標以及監視與控制代理程式。依預設,您定義的任何其他群組中的使用者均無法取得管理服務連線。
作為 MQ 管理員,您可以定義群組,並將使用者與使用者儲存庫中的那些群組相關聯 (儘管群組在文字檔案使用者儲存庫中不能完全得到支援)。然後,透過編輯存取控制屬性檔案,您可以指定使用者和群組對目標的存取權,以用於生產和使用訊息,或在佇列目標中瀏覽訊息。您可以使個別目標或所有目標僅可由特定使用者或群組進行存取。
此外,如果代理程式已配置為允許自動建立目標 (請參閱自動建立的 (對應管理員建立的) 目標),則您可以透過編輯存取控制屬性檔案來控制代理程式可為何人自動建立目標。
加密 (企業版)
若要加密在用戶端與代理程式之間傳送的訊息,您需要使用基於安全套接層 (SSL) 標準的連線服務。透過在已啟用 SSL 的代理程式與已啟用 SSL 的用戶端之間建立已加密連線,SSL 可提供連線級別的安全性。
若要使用 MQ 基於 SSL 的連線服務,您將使用鍵值工具公用程式 (imqkeytool) 產生私密密鑰/公開密鑰對。此公用程式將公開密鑰內嵌在自身簽名的證書中,並放置在 MQ 鍵值儲存區中。MQ 鍵值儲存區自身具有密碼保護;若要對其解除鎖定,您必須在啟動時提供鍵值儲存區密碼。請參閱加密:使用 SSL 服務 (企業版)。
一旦鍵值儲存區解除鎖定,則代理程式可將證書傳送至請求連線的任何用戶端。然後,用戶端使用此證書設定與代理程式的已加密連線。
表格 2-6 中顯示用於認證、授權、加密以及其他安全通訊的可配置屬性。(如需有關配置這些屬性的說明,請參閱第 5 章「啟動與配置代理程式」。)
表格 2-6    安全性屬性
屬性名稱
描述
imq.authentication.type
指定密碼應以基本 64 編碼 (basic) 傳送,或作為 MD5 摘要 (digest) 傳送。為代理程式支援的所有連線服務設定編碼。預設:digest
imq.service_name.
authentication.type
指定密碼應以基本 64 程式碼 (basic) 傳送,或作為 MD5 摘要 (digest) 傳送。為已命名的連線服務設定編碼,並置換任何代理程式範圍的設定。
預設:繼承 imq.authentication.type 設定的值。imq.authentication.
basic.user_repository
(用於基本 64 程式碼) 指定用於認證的使用者儲存庫的類型,即基於檔案 (file) 或 LDAP (ldap)。如需其他 LDAP 屬性,請參閱表格 8-5。預設:file
imq.authentication.
client.response.timeout
指定系統等待用戶端回應來自代理程式的認證請求的時間 (以秒為單位)。預設:180 (秒)
imq.accesscontrol.
enabled
為代理程式支援的所有連線服務設定存取控制 (true/false)。表示系統是否將檢查已認證的使用者擁有使用連線服務的許可權,或擁有執行與特定目標相關的特定 MQ 作業的許可權 (如存取控制屬性檔案中所指定)。預設:true
imq.service_name.
accesscontrol.enabled
為已命名的連線服務設定存取控制 (true/false),並置換代理程式範圍的設定。表示系統是否將檢查已認證的使用者擁有使用已命名連線服務的許可權,或擁有執行與特定目標相關的特定 MQ 作業的許可權 (如存取控制屬性檔案中所指定)。
預設:繼承屬性 imq.accesscontrol.enabled 的設定imq.accesscontrol.file.
filename
為代理程式支援的所有連線指定存取控制屬性檔案的名稱。此檔案名稱指定目錄 IMQ_HOME/etc (在 Solaris 上為 /etc/imq) 的相對檔案路徑。預設:accesscontrol.properties
imq.service_name.
accesscontrol.file.
filename
為已命名的連線服務指定存取控制屬性檔案的名稱。此檔案名稱指定目錄 IMQ_HOME/etc (在 Solaris 上為 /etc/imq) 的相對檔案路徑。
預設:繼承由 imq.accesscontrol.file.filename 指定的設定。imq.passfile.enabled
指定是否已在密碼檔案中指定用於安全通訊的使用者密碼 (用於 SSL、LDAP、JDBC) (true/false)。預設:false
imq.passfile.dirpath
指定包含密碼檔案之目錄的路徑。
預設:IMQ_HOME/etc (在 Solaris 上為 /etc/imq)imq.passfile.name
指定密碼檔案的名稱。預設:passfile
imq.keystore.property_name
用於基於 SSL 的服務:指定與 SSL 鍵值儲存區相關的安全性屬性。請參閱表格 8-8。
記錄程式
代理程式包括一些用於監視和診斷其作業的元件。其中有產生資料 (代理程式碼、標準資訊產生器以及除錯程式) 的元件,還有可透過一些輸出通道 (日誌檔、主控台以及 Solaris 系統日誌) 寫出資訊的記錄程式元件。圖 2-6 中說明了此機制。
圖 2-6    記錄機制
![]()
您可以開啟或關閉標準資訊資料的產生,並指定產生標準資訊報告的頻率。
您還可以指定記錄程式級別 範圍從最嚴重和最重要的資訊 (錯誤) 至不太重要的資訊 (標準資訊資料)。表格 2-7 中以重要性的降序方式顯示了資訊的種類:
表格 2-7    記錄種類
種類
描述
ERROR
表示可導致系統故障問題的訊息
WARNING
應加以注意但不會導致系統故障的警示
INFO
標準資訊和其他資訊性訊息的報告
若要設定記錄程式級別,您可指定這些種類之一。記錄程式將寫出指定種類和所有更高級種類的資料。例如,如果您指定 WARNING 級別的記錄,則記錄程式將寫出警告資訊和錯誤資訊。
記錄程式可將資料寫入至一些輸出通道:標準輸出 (主控台)、日誌檔以及系統日誌常駐程式 (在 Solaris 平台上)。
對於每個輸出通道,您均可以指定為記錄程式設定的哪些種類將寫入至此通道。例如,如果記錄程式級別設定為 ERROR,則可以指定您僅將錯誤和警告寫入至主控台,以及僅將資訊 (標準資訊資料) 寫入至日誌檔。如需有關配置和使用 Solaris 系統日誌的資訊,請參閱 syslog(1M)、syslog.conf(4) 和 syslog(3C) 線上援助頁。
在日誌檔中,您可以指定何時關閉日誌檔並將輸出捲動至新檔案。一旦日誌檔達到指定容量或存在時間,系統將儲存此日誌檔並建立新的日誌檔。日誌檔儲存在以下位置:
IMQ_VARHOME/instances/brokerName/log/
(在 Solaris 上為 /var/imq/instances/brokerName/log/)當建立新的捲動日誌檔時,則 9 個最新日誌檔的歸檔檔案將被保留。日誌檔為文字檔案,它們相繼命名如下:
log.txt
log_1.txt
log_2.txt
...
log_9.txtlog.txt 為最新檔案,編號最高的檔案為最舊檔案。
表格 2-8 中顯示代理程式的可配置屬性,它們用於設定資訊的產生和記錄。(如需有關配置這些屬性的說明,請參閱第 5 章「啟動與配置代理程式」。)
實體目標
MQ 訊息傳送以兩個階段的訊息遞送為前提:首先,從生產者用戶端至代理程式上的目標的訊息遞送,然後,從代理程式上的目標至一個或多個使用者用戶端的訊息遞送。有兩種類型的目標 (請參閱程式設計網域):佇列 (點對點遞送模型) 和主題 (出版/訂閱遞送模型)。這些目標表示在代理程式實體記憶體中的位置,進來的訊息在路由至使用者用戶端之前在這些位置進行整理。
您可以使用 MQ 管理工具建立實體目標 (請參閱管理目標)。目標還可自動建立,如自動建立的 (對應管理員建立的) 目標中所述。
本節描述兩種類型實體目標的屬性與運作方式:佇列與主題。
佇列目標
佇列目標用於點對點訊息傳送,其中訊息表示最終僅遞送至已在目標中註冊其興趣的一些使用者之一。當訊息從生產者用戶端到達時,它們會形成佇列並遞送至使用者用戶端。
已形成佇列的訊息的路由取決於佇列的遞送策略。MQ 實施三種佇列遞送策略:
- 單一 此佇列僅可將訊息路由至一個訊息使用者。如果第二個訊息使用者嘗試註冊此佇列,則將被拒絕。如果已註冊訊息使用者離線,則不再發生訊息路由,並且訊息將被儲存,直至新的使用者註冊。
- 故障轉移 (企業版) 此佇列可將訊息路由至多個訊息使用者,但僅在其主訊息使用者 (第一個註冊代理程式的使用者) 離線時才執行此作業。在此情況下,訊息將轉至下一個要註冊的使用者,並繼續路由至此使用者,直至此使用者發生故障,等等。如果訊息使用者未註冊,則訊息將被儲存,直至使用者註冊。
- 循環 (企業版) 此佇列可將訊息路由至多個訊息使用者。假設一些使用者註冊一個佇列,則進入此佇列的第一個訊息將路由至已註冊的第一個訊息使用者,第二個訊息路由至已註冊的第二個使用者,等等。其他訊息以相同的順序路由至同組使用者。如果在使用者註冊佇列之前一些訊息已形成佇列,則這些訊息將被批次路由,以免湧向任一使用者。如果訊息使用者離線,則路由至此使用者的訊息將在剩餘的作用中使用者之間進行重新分布。由於進行重新分布,因此無法保證訊息遞送至使用者的順序與佇列接收它們的順序相同。
由於訊息可在佇列中保留較長一段時間,因此會出現記憶體資源問題。您不應為佇列配置太多的記憶體 (記憶體未完全利用),也不應配置太少 (訊息將被拒絕)。考慮到基於每個佇列載入需求的靈活性,您可在建立佇列時設定實體屬性:佇列中訊息的最大數量、為佇列中訊息配置的最大記憶體,以及佇列中任何訊息的最大容量 (請參閱表格 6-10)。
主題目標
主題目標用於出版/訂閱訊息傳送,其中訊息表示最終遞送至已在目標中註冊其興趣的所有使用者。當訊息從生產者到達時,它們會被路由至訂閱此主題的所有使用者。如果使用者已註冊此主題的持久訂閱,則他們不會在訊息遞送至此主題時成為作用中使用者 代理程式將儲存訊息直至使用者再次成為作用中使用者,然後遞送訊息。
訊息通常不會在主題目標中保留較長一段時間,因此通常不會出現大的記憶體資源問題。但是,您可以配置目標 (請參閱表格 6-10) 接收的任何訊息所允許的最大容量。
自動建立的 (對應管理員建立的) 目標
由於 JMS 訊息伺服器是訊息傳送系統中的中央集線器,因此其效能和可靠性對企業應用程式的成功相當重要。由於目標可使用大量資源 (取決於它們處理的訊息數量和容量,以及註冊的訊息使用者的數量和持久性),因此它們需要嚴密管理,以確保訊息伺服器的效能和可靠性。因此,MQ 管理員的標準慣例即為建立作為應用程式的目標、監視目標,以及必要時重新配置它們的資源需求。
然而,也可能有希望動態建立目標的情況。例如,在開發及測試循環期間,您可能希望代理程式依需要自動建立目標,而不需要管理員的介入。
MQ 支援這種自動建立功能。啟用自動建立後,每當 MessageConsumer 或 MessageProducer 嘗試存取不存在的目標時,代理程式便會自動建立目標。(用戶端應用程式的使用者必須擁有自動建立的權限 請參閱目標自動建立存取控制)。
但是,當自動建立而不是明確建立目標時,可能導致不同的用戶端應用程式 (使用相同的目標名稱) 之間的衝突,或降低系統效能 (歸因於支援目標所需的資源)。由於此原因,當不再使用 MQ 自動建立的目標時,此目標將被代理程式自動銷毀:即,當此目標不再有訊息使用者用戶端且不再包含任何訊息時。如果代理程式重新啟動,則它將僅重新建立自動建立的目標 (如果這些目標它們包含永久性訊息)。
您可以使用表格 2-9 中所示的屬性配置 MQ 訊息伺服器,以啟用或停用自動建立功能。(如需有關配置這些屬性的說明,請參閱第 5 章「啟動與配置代理程式」。)
暫存目標
暫存目標由用戶端應用程式明確建立和銷毀 (使用 JMS API),這些應用程式需要目標以接收傳送至其他用戶端的訊息回覆。這些目標由代理程式維護,僅用於為建立目標所需連線的持續時間。只要暫存目標處於使用中,它無法由管理員銷毀,也無法由用戶端應用程式銷毀:即,如果它有作用中的訊息使用者。暫存目標不同於管理員建立的或自動建立的目標 (包含永久性訊息),它們無法永久儲存,並當重新啟動代理程式時從不重新建立。它們對於 MQ 管理工具而言也不可視。
多重代理程式叢集 (企業版)
MQ 企業版支援使用多重互連的代理程式實例 (代理程式叢集) 的訊息伺服器的實施。叢集支援提供訊息伺服器的延展性。
隨著連線至代理程式的用戶端數量的增加,以及要遞送的訊息數量的增加,代理程式將最終超過資源限制 (如檔案描述元和記憶體限制)。提供增加的載入的一個方法為將多個代理程式 (即多個代理程式實例) 新增至 MQ 訊息伺服器,從而在多重代理程式間分布用戶端連線和訊息遞送。
您還可以使用多重代理程式最適化網路頻寬。例如,您可以在一組遠端代理程式間使用較慢、距離較長的網路連結,而使用較高速度的連結將用戶端連線至其各自的代理程式。
然而,使用代理程式叢集還有其他原因 (例如,提供具有不同使用者儲存庫的工作群組,或處理防火牆限制),故障轉移不是這些原因之一。叢集中的代理程式無法用作出現故障的其他代理程式的自動備份。MQ 版本 3.0.1 不支援代理程式的自動故障轉移保護功能。(但是,應用程式可設計為使用多重代理程式,以實施自訂的故障轉移機制。)
使用叢集 (企業版) 中提供有關配置和管理代理程式叢集的資訊。
以下各節介紹 MQ 代理程式叢集的架構和內部功能。
多重代理程式架構
多重代理程式訊息伺服器允許用戶端連線分布在一些代理程式實例中,如圖 2-7 中所示。從用戶端的角度看,每個用戶端均連線至個別代理程式 (它的主代理程式),並傳送和接收訊息,猶如此主代理程式為叢集中唯一的代理程式。但是,從訊息伺服器的角度看,主代理程式與叢集中的其他代理程式以串聯方式工作,為訊息生產者以及與其直接連線的使用者提供遞送服務。
一般來說,叢集中的代理程式可用任一隨機拓撲連線。但是,MQ 版本 3.0.1 僅支援完全連線的叢集 (即拓撲),在拓撲中每個代理程式均直接連線至叢集中所有其他代理程式,如圖 2-7 中所示。
圖 2-7    多重代理程式 (叢集) 架構
![]()
在多重代理程式配置中,每個目標的實例均常駐在叢集中所有代理程式上。此外,每個代理程式均瞭解已註冊所有其他代理程式的訊息使用者。因此,每個代理程式均可將訊息從其直接連線的訊息生產者路由至遠端訊息使用者,並將訊息從遠端生產者遞送至其直接連線的使用者。
在叢集配置中,與每個訊息生產者直接連線的代理程式為此生產者傳送至它的訊息執行路由。因此,永久性訊息由其主代理程式儲存和路由。
每當管理員在代理程式上建立或銷毀目標時,此資訊會自動傳遞至叢集中所有其他代理程式。同樣,每當訊息使用者註冊其主代理程式,或使用者與其主代理程式中斷連線 (明確中斷連線,或者因為用戶端或網路故障,或者因為其主代理程式出現故障) 時,有關使用者的相關資訊會在叢集中傳遞。在類似方式下,有關持久訂閱的資訊也會傳遞至叢集中的所有代理程式。
註 大量的網路流量和/或大量訊息可阻礙內部叢集連線。增加的等待時間有時可導致鎖定協定逾時錯誤。結果,用戶端可能在嘗試建立持久訂閱者或佇列訊息使用者時出現異常。使用較高速度的連線通常可避免這些問題。
將有關目標和訊息使用者的資訊傳遞至特定代理程式,通常會要求當共用資源發生變更時此代理程式應在線上。如果當進行此類變更時代理程式離線 (例如,如果代理程式崩潰且隨後重新啟動,或者如果將新代理程式動態新增至叢集),將會如何?
為了提供已離線的代理程式 (或已新增的新代理程式),MQ 將保留對叢集中所有永久性實體所作變更的記錄。即,已建立或銷毀的所有目標與所有持久訂閱的記錄。當代理程式動態新增至叢集時,它先從此配置變更記錄中讀取目標和持久訂閱者資訊。當它上線後,它將與其他代理程式交換有關目前作用中的使用者的資訊。新代理程式可使用此資訊完全整合至叢集。
配置變更記錄由叢集中的代理程式之一 (即指定為主代理程式的代理程式) 管理。由於主代理程式對於將代理程式動態新增至叢集極為關鍵,因此您應始終先啟動此代理程式。如果主代理程式不在線上,則叢集中的其他代理程式將無法完成它們的初始化。
如果主代理程式離線,則其他代理程式則無法存取配置變更記錄,而且 MQ 將不允許目標和持久訂閱在叢集中傳遞。在這些情況下,如果您嘗試建立或銷毀目標或持久訂閱 (或嘗試執行一些重新啟動持久訂閱之類的相關作業),則會出現異常。
在任務重要的應用程式環境中,應定期備份配置變更記錄,以防止意外損毀記錄並避免主代理程式發生故障。您可以使用 imqbrokerd 指令的 -backup 選項 (請參閱表格 5-2) 執行此作業,此選項可提供建立包含配置變更記錄的備份檔案的方法。隨後,您可以使用 -restore 選項復原此配置變更記錄。
如有必要,您可以透過備份配置變更記錄及修改適當的叢集配置屬性 (請參閱表格 2-10) 來變更作為主代理程式服務的代理程式,以指定新的主代理程式,並使用 -restore 選項來重新啟動此新的主代理程式。
使用開發環境中的叢集
在開發環境中,叢集用於測試,而延展性與代理程式回復並非重要注意事項,因此不需要主代理程式。在未配置主代理程式的環境中,MQ 不需要主代理程式處於執行狀態以啟動其他代理程式,並且允許對目標與持久訂閱進行變更並將它們傳遞至叢集中所有執行中的代理程式。但是,如果代理程式離線並隨後復原,則它將不會與其離線時所作的變更同步。
在測試情況下,目標通常是自動建立的 (請參閱自動建立的 (對應管理員建立的) 目標),這些目標的持久訂閱由要進行測試的應用程式建立和銷毀。對目標和持久訂閱所作的這些變更將在叢集中傳遞。但是,如果您重新配置環境以使用主代理程式,則 MQ 將重新強加需求,即主代理程式處於執行狀態,以便對目標與持久訂閱進行變更,並使這些變更在叢集中傳遞。
叢集配置屬性
叢集中的每個代理程式必須在啟動時傳送有關叢集中其他代理程式的資訊 (主機名稱與連接埠號)。此資訊用於在叢集中的代理程式之間建立連線。每個代理程式還必須知道主代理程式 (如果已使用) 的主機名稱和連接埠號。
叢集中的所有代理程式均應使用相同的叢集配置屬性。透過將叢集配置屬性放在啟動時每個代理程式均參考的一個中央叢集配置檔案中,您便可以達到此目的。
(您還可以複製這些配置屬性,並分別將它們提供給每個代理程式。但是,不建議這樣做,因為它可能導致叢集配置的不一致性。僅保留叢集配置屬性的副本可確保所有代理程式均參閱相同的資訊。)
表格 2-10 中顯示 MQ 叢集配置屬性。(如需有關設定這些屬性的說明,請參閱使用叢集 (企業版)。)
叢集配置檔案可用於儲存一組代理程式共用的所有代理程式配置屬性。儘管它原先專用於配置叢集,但是它還可用於儲存叢集中所有代理程式共用的其他代理程式屬性。
MQ 用戶端運行時間
MQ 用戶端運行時間為用戶端應用程式提供一個至 MQ 訊息伺服器的介面,它為用戶端應用程式提供 JMS 程式設計模型 中介紹的所有 JMS 程式設計物件。它支援用戶端將訊息傳送至目標和從此類目標接收訊息所需的所有作業。
本節提供 MQ 用戶端運行時間如何工作的詳細描述。MQ Developer's Guide 中說明了影響其效能的因素,因為這些因素影響用戶端應用程式的設計和效能。
圖 2-8 說明訊息生產與使用如何在用戶端應用程式與 MQ 用戶端運行時間之間進行互動,而訊息遞送如何在 MQ 用戶端運行時間與 MQ 訊息伺服器之間進行互動。
圖 2-8    訊息傳送作業
![]()
訊息生產
在訊息生產中,訊息由用戶端建立,並透過連線傳送至代理程式上的目標。如果 MessageProducer 物件的訊息遞送模式已設定為永久性 (可確保的遞送,一次且僅有一次),則用戶端執行緒會封鎖,直至此代理程式回應訊息已遞送至其目標並儲存在代理程式的永久性資料儲存區中。如果訊息不是永久性的,則代理程式不會傳回代理程式回應訊息 (在屬性名稱中稱為「Ack」),並且用戶端執行緒不會封鎖。
訊息使用
訊息使用比生產更為複雜。在以下條件下,到達代理程式上目標的訊息會透過連線遞送至 MQ 用戶端運行時間:
- 用戶端已為給定的目標設定使用者。
- 使用者的選取條件 (如果有) 符合到達給定目標的訊息的條件。
- 系統已告知連線啟動訊息遞送。
透過連線遞送的訊息分布至適當的 MQ 階段作業,在此階段作業中,這些訊息形成佇列以供適當的 MessageConsumer 物件使用,如圖 2-9 中所示。訊息從每個階段作業佇列取回,每次一個 (階段作業為單一執行緒的),並同步使用 (透過呼叫 receive 方法的用戶端執行緒) 或非同步使用 (透過呼叫 MessageListener 物件的 onMessage 方法的階段作業執行緒)。
圖 2-9    訊息遞送至 MQ 用戶端運行時間
![]()
當代理程式將訊息遞送至用戶端運行時間時,它會相應地標記訊息,但無法真正知道它們是否已被接收或使用。因此,在將訊息從代理程式目標刪除之前,代理程式會等待用戶端回應訊息的接收。
MQ 受管理物件
受管理物件允許用戶端應用程式碼獨立於供應程式。透過將供應程式特定的實施與配置資訊封裝在由用戶端應用程式以獨立於供應程式的方式使用的物件中,它們可達到此目的。受管理物件由管理員建立和配置,儲存在名稱服務中,並由用戶端應用程式透過標準的 JNDI 查找程式碼存取。
MQ 提供兩種類型的受管理物件:ConnectionFactory 與目標。當這兩種類型的受管理物件封裝供應程式特定的資訊時,它們會使用完全不同的用戶端應用程式。ConnectionFactory 物件用於建立與訊息伺服器的連線,而目標物件則用於識別實體目標。
受管理物件使控制和管理 MQ 訊息伺服器非常容易:
- 透過要求用戶端應用程式存取預先配置的 ConnectionFactory 物件 (請參閱受管理物件屬性),您可以控制連線的運作方式。
- 透過要求用戶端應用程式存取與現有實體目標相符的預先配置的目標物件,您可以控制實體目標的激增。(您還必須停用代理程式的自動建立功能 請參閱自動建立的 (對應管理員建立的) 目標)。
- 透過置換用戶端應用程式設定的訊息標頭值 (請參閱受管理物件屬性),您可以控制 MQ 訊息伺服器資源。
因此,此排序可讓您 (作為 MQ 管理員) 控制訊息伺服器配置的詳細資訊,同時還允許用戶端應用程式獨立於供應程式:它們不必瞭解供應程式特定的語法和物件命名慣例 (請參閱 JMS 提供者獨立性),或供應程式特定的配置屬性。
您可以使用 MQ 管理工具建立受管理物件,如第 7 章「管理受管理物件」中所述。建立受管理物件時,您可以指定其為唯讀 即防止用戶端應用程式變更建立物件時已設定的 MQ 特定的配置值。換言之,用戶端程式碼無法設定有關唯讀受管理物件的屬性值,您也無法使用用戶端應用程式啟動選項來置換這些值,如啟動用戶端時置換屬性值中所述。
而用戶端應用程式可在其上創設 ConnectionFactory 和目標受管理物件,此做法會逐漸損壞受管理物件的基本用途 可讓您 (作為 MQ 管理員) 控制應用程式所需的代理程式資源,並調整其效能。此外,直接創設受管理物件可使用戶端應用程式為供應程式特定的,而不是獨立於供應程式的。
連線工廠受管理物件
ConnectionFactory 物件用於在用戶端應用程式與 MQ 訊息伺服器之間建立實體連線。它還用於指定連線與用戶端運行時間的運作方式,此用戶端運行時間使用連線存取代理程式。
如果您希望支援分散式異動 (請參閱本地異動),則需要使用可支援分散式異動的特殊 XAConnectionFactory 物件。
若要建立 ConnectionFactory 受管理物件,請參閱新增連線工廠。
透過配置 ConnectionFactory 受管理物件,您可以指定此受管理物件生產的所有連線共用的屬性值 (屬性)。ConnectionFactory 與 XAConnectionFactory 物件共用同一組屬性。根據這些屬性影響的運作方式,可將它們群組為一些種類:
- 連線規格
- 自動重新連線運作方式
- 用戶端識別
- 訊息標頭置換
- 可靠性與流量控制
- 佇列瀏覽器運作方式
- 應用程式伺服器支援
- JMS 定義的屬性支援
MQ Developer's Guide 中詳細說明了這些種類中的每種及其相應的屬性。而系統可能要求您 (作為 MQ 管理員) 調整這些屬性的值,通常由應用程式開發人員決定需要調整哪些屬性以調整用戶端應用程式的效能。表格 7-3 描述了按字母順序列出的屬性摘要。
目標受管理物件
目標受管理物件表示代理程式中的實體目標 (佇列或主題),共用名稱為 目標的物件與此實體目標相符。表格 2-11 中描述了它的兩個屬性。透過建立目標物件,您可允許用戶端應用程式的 MessageConsumer 和/或 MessageProducer 物件來存取相應的實體目標。若要建立目標受管理物件,請參閱新增主題或佇列。
啟動用戶端時置換屬性值
如同任何 Java 應用程式,您可以使用指令行啟動訊息傳送應用程式,以指定系統屬性。此機制還可用於置換受管理物件的屬性值,這些屬性值用於用戶端應用程式碼。例如,您可以置換受管理物件的配置,此受管理物件可在用戶端應用程式碼中透過 JNDI 查找存取。
若要在啟動用戶端應用程式時置換受管理物件的設定,您可以使用以下指令行語法:
java [[-Dattribute=value ]...] clientAppName
其中,屬性與連線工廠受管理物件中提供的任何 ConnectionFactory 受管理物件屬性相符。
例如,如果您要將用戶端應用程式連線至不同的代理程式,而不是在用戶端程式碼中存取的 ConnectionFactory 受管理物件中所指定的代理程式,您可以使用指令行置換來啟動用戶端應用程式,以設定其他代理程式的 imqBrokerHostName 和 imqBrokerHostPort。
但是,如果受管理物件已設定為唯讀,則使用指令行置換無法變更其屬性值。任何此類置換均被完全忽略。