到目前為止,我們已說明訊息導向中介軟體的元素,以及使用 JMS 增加 MOM 應用程式的可移植性。接下來要說明 Message Queue 如何實作 JMS 規格,並介紹其用於提供可靠、安全和可延展訊息傳送服務的功能與工具。
首先,和許多 JMS 提供者一樣,Message Queue 可以作為獨立產品,也可以用作內嵌在 J2EE 應用程式伺服器的啟用技術,以提供非同步的訊息傳送。第 5 章, Message Queue 和 J2EE對 Message Queue 在 J2EE 中所扮演的角色會有更詳盡的說明。與其他 JMS 提供者不同的是,Message Queue 已指定為 JMS 參照實作。此指定證明了 Message Queue 是正確完整的 JMS 實作。亦保證未來的 JMS 修訂和延伸可以繼續使用 Message Queue 產品。
作為 JMS 提供者,Message Queue 提供訊息傳送服務,該服務實作 JMS 介面並提供管理服務與控制。到目前為止,在對 JMS 提供者的說明中,我們一直著重於代理程式在轉送訊息時所扮演的角色。但事實上,JMS 提供者必須包括除代理程式以外的許多元素,以提供可靠、安全、可延展的訊息傳送。圖 1–6 顯示組成 Message Queue 訊息服務的元素。這些元素包含多種連線服務 (支援不同的協定)、管理工具和資料存放區,以傳送訊息、監視和處理使用者資訊。Message Queue 服務本身包含圖中以灰色標記的所有元素。
如您所見,功能完整的 JMS 提供者的複雜程度超出基本 JMS 模型甚多。下列各節將說明上述的 Message Queue 服務元素。這些元素可分為三類:代理程式、用戶端執行階段支援和管理。
如圖 1–6 所示,應用程式用戶端和管理用戶端均可連線到代理程式。JMS 規格並未規定提供者必須實作任何特定的線路協定。應用程式用戶端和管理用戶端用於連線到代理程式的 Message Queue 服務,目前位於 TCP、TLS、HTTP 或 HTTPS 協定的最上層。(位於 HTTP 最上層的服務可讓訊息通過防火牆。)
提供 JMS 支援並可讓用戶端連線到代理程式的服務 (jms、ssljms、http 或 https) 類型為 NORMAL,並位於 TCP、TLS、HTTP 或 HTTPS 協定的最上層。
可讓管理員連線到代理程式的服務 (admin、ssladmin) 類型為 ADMIN,並位於 TCP 或 TLS 協定的最上層。
依預設,啟動代理程式時,jms 和 admin 服務會啟動並執行。此外,您可以將代理程式配置為執行這些連接服務的任何一種或全部。每個服務支援特定的認證與授權 (存取控制) 功能,且每個服務為多重執行緒作業,支援多重連線。
如果連線失敗,Message Queue 服務會自動重新嘗試將用戶端連線至同一個代理程式,或連線至其他代理程式 (如果已啟用此功能)。如需更多資訊,請參閱附錄 BMessage Queue 功能 中關於自動重新連線功能的描述。
用戶端可以在建立連線工廠以取得連線時,配置連線執行階段支援。選項可讓您指定代理程式連線的目標、如何處理重新連線、訊息流量控制等。如需有關連線配置方式的其他資訊,請參閱連線工廠與連線。
代理程式是訊息服務的核心,可以可靠地路由和傳送訊息、認證使用者,並收集用於監視效能的資料。
為了路由及傳送訊息,代理程式會將內送訊息置於其各自的目標,並管理進出這些目標的訊息流量。
為了提供可靠的傳送,代理程式會使用永久性存放區來儲存狀態資訊和永久性訊息 (直到訊息被接收為止)。如果代理程式或連線失敗,儲存的資訊會讓代理程式復原代理程式的狀態,然後重試作業。
為了提供所交換資料的安全性,代理程式會使用經過認證的連線。也可以經由 SSL 之類的安全協定,執行資料加密。代理程式還會使用並管理儲存庫,以保留使用者資訊以及使用者可以存取的資料或作業。代理程式會查找此儲存庫內的資訊,以認證請求服務的使用者,並授權使用者想要執行的作業。
為了監視系統,代理程式會產生度量和診斷資訊供管理員存取,以測量效能並調校代理程式。度量資訊亦可透過程式設計的方式取得,以允許應用程式調整訊息流量和式樣來改善效能。
Message Queue 服務提供多種管理工具,管理員可用於配置代理程式支援。如需更多資訊,請參閱管理。
建立 Message Queue 用戶端時,所連結的程式庫便會提供用戶端執行階段支援。您可以將用戶端執行階段想像為 Message Queue 服務變成為用戶端一部分的一個階段。例如,當用戶端程式碼呼叫 API 傳送訊息時,會呼叫這些程式庫中的程式碼,以便用適當方式為協定封裝訊息位元,而此協定將用於將訊息轉送至代理程式上的實體目標。
只有支援 Java 用戶端時才需要 JMS 提供者;但是,如圖 1–6 所示,Message Queue 用戶端可以使用 Java 或提供者專用的 C API,傳送或接收訊息。這些介面是在 Java 或 C 執行階段程式庫中實作,會執行建立代理程式連線與依據連線服務請求封裝位元的實際工作。
Java 用戶端執行階段提供 Java 用戶端與代理程式互動所需的物件。這些物件包括連線、階段作業、訊息、訊息產生器與訊息用戶。
C 用戶端執行階段提供 C 用戶端與代理程式互動所需的功能和結構。它支援 JMS 程式設計模型的程序版本。C 用戶端無法使用 JNDI 來存取受管理物件,但是可以透過程式設計建立連線工廠和目標。
Message Queue 服務提供 C API,使舊版 C 和 C++ 應用程式能參與 JMS 型訊息傳送。這兩種 API 所提供的功能中有許多不同之處,會在Java 用戶端與 C 用戶端中進行說明。
請謹記, JMS 規格是僅限於 Java 用戶端使用的標準。C 支援是 Message Queue 提供者專用的支援,不能用於計劃移植到其他提供者的用戶端應用程式。
Message Queue Java 用戶端也可以傳送和接收包裝成 JMS 訊息的 SOAP 訊息。SOAP (簡易物件存取協定) 允許在分散式環境中的兩個對等端之間交換結構化資料。交換的資料由 XML 機制指定。
Sun SOAP 處理目前限制為使用點對點模型,且不保證可靠性。您可以將 SOAP 訊息包裝在 JMS 訊息中,並使用代理程式路由該訊息,這樣就可利用完整功能的 Message Queue 訊息傳送以保證可靠的傳送,並能使用主題及點對點網域。Message Queue 提供公用程式常式,讓訊息產生器將 SOAP 訊息包裝到 JMS 訊息中,也可以讓訊息用戶從 JMS 訊息擷取 SOAP 訊息。
使用 SOAP 訊息為您提供有關 SOAP 訊息處理更加詳細的說明。
Message Queue 服務提供指令行工具,可用於執行下列作業:
啟動並配置代理程式。
建立並管理目標、管理代理程式連線,以及管理代理程式資源。
在 JNDI 物件存放區中增加、列出、更新和刪除受管理物件。
寫入和管理檔案式使用者儲存庫。
建立和管理用於永久性存放區的 JDBC 相容資料庫。
您也可以使用 GUI 型管理主控台,以執行下列指令行功能:
連接至代理程式並進行管理。
建立和管理實體目標。
連線到物件存放區、將物件增加到存放區,以及管理這些物件。
隨著用戶端數目或連線數量的增加,您可能需要延展訊息服務,以突破瓶頸或改善效能。Message Queue 訊息服務會依照您的需求提供多種延展選項。為方便起見,這些選項可分為下列種類:
垂直延展的方式是增加更多處理能力及擴充可用資源。方法是增加更多處理器或記憶體、切換至共用執行緒模型,或以 64 位元模式執行 Java VM。
如果您使用點對點網域,可以藉由允許多個用戶存取佇列,來延展用戶端。使用這種方式,可以指定使用中和備份用戶的最大數目。負載平衡機制也會考慮用戶的目前處理能力與訊息處理率。這屬於 Message Queue 功能。(JMS 規格定義僅有一個用戶存取佇列的訊息傳送運作方式;允許多個用戶的佇列運作方式隨提供者而定。Message Queue 開發者指南提供此延展選項的更多資訊。)
無狀態水平延展的方式是增加代理程式,並重新分發現有的用戶端到這些代理程式。此方式易於執行,但是僅在訊息傳送作業可以劃分為獨立的工作群組時才適用。
狀態水平延展的方式是將代理程式連線到叢集中。在代理程式叢集中,每個代理程式都會連線到叢集中的其他代理程式,亦會連線到其本機應用程式用戶端。代理程式可位於相同的主機或分散在網路中不同的主機。有關目標和用戶的資訊會複製到叢集中的所有代理程式上。目標或訂閱者的更新也會進行傳播,因此每個代理程式可以從產生器路由訊息到其直接連線到用戶的代理程式,而這些用戶是連線到叢集的其他代理程式。在使用備份用戶的情況下,如果代理程式或連線失敗,則傳送到無法存取的用戶之訊息,會轉寄至其他代理程式上的備份用戶。
如果代理程式或連線失敗,有關永久性實體 (目標和長期訂閱) 的狀態資訊可能會不同步。例如,如果叢集代理程式失敗,且在叢集的其他代理程式上建立目標,則當第一個代理程式重新啟動時,將不知道這個新目標。若要避免此問題,可以將叢集中的某個代理程式指定為主代理程式。此代理程式負責追蹤主配置檔案中對目標和長期訂閱的所有變更,並且負責更新叢集中暫時離線的代理程式。如需更多資訊,請參閱第 4 章, 代理程式叢集。
若是代理程式或連線失敗,即使使用主代理程式,Message Queue 也只提供服務可用性,而不會提供資料可用性。例如,若是叢集代理程式變成無法使用,代理程式所保留的任何永久性訊息都會變成無法使用,直到代理程式回復為止。目前確保資料可用性的唯一方法,是透過使用 SunCluster Message Queue 代理程式。在這種情況下,永久性存放區會位於共用檔案系統上。如果代理程式失敗,則第二個節點上的 Message Queue 代理程式會啟動某個代理程式,來接管共用存放區。用戶端會重新連線到該代理程式,並由此繼續取得服務及存取永久性資料。