訊息佇列(Message Queue)簡介及其使用

巴扎黑
發布: 2016-12-20 09:25:03
原創
1561 人瀏覽過

利用 MSMQ(Microsoft Message Queue),應用程式開發人員可以透過發送和接收訊息方便地與應用程式進行快速可靠的通訊。訊息處理為您提供了有保障的訊息傳遞和執行許多業務處理的可靠的防故障方法。

MSMQ與XML Web Services和.Net Remoting一樣,是一種分散式開發技術。但在使用XML Web Services或.Net Remoting元件時,Client端需要和Server端即時交換訊息,Server需要保持連線。 MSMQ則可以在Server離線的情況下運作,將Message暫時保存在Client端的訊息佇列中,以後連線時再傳送到Server端處理。

顯然,MSMQ不適合於Client需要Server端及時響應的這種情況,MSMQ以異步的方式和Server端交互,不用擔心等待Server端的長時間處理過程。

 

雖然XML Web Services和.Net Remoting都提供了[OneWay]屬性來處理非同步調用,用來解決Server端長方法調用長時間阻礙Client端。但無法解決大量Client負載的問題,此時Server接受的請求快於處理請求。

一般情況下,[OneWay]屬性不用於專門的訊息服務。

 

1. 基本術語與概念(Basic terms and concepts)

「訊息」是在兩台電腦間傳送的資料單位。訊息可以非常簡單,例如只包含文字字串;也可以更複雜,可能包含嵌入物件。

 

訊息被送到佇列中。 「訊息佇列」是在訊息的傳輸過程中保存訊息的容器。訊息佇列管理器在將訊息從它的來源中繼到它的目標時充當中間人。佇列的主要目的是提供路由並保證訊息的傳遞;如果發送訊息時接收者不可用,訊息佇列會保留訊息,直到可以成功地傳遞它。

 

「訊息佇列」是 Microsoft 的訊息處理技術,它在任何安裝了 Microsoft Windows 的電腦組合中,為任何應用程式提供訊息處理和訊息佇列功能,無論這些電腦是否在同一個網路上或是否同時連線。

 

「訊息佇列網路」是指能夠相互間來回傳送訊息的任何一組電腦。網路中的不同電腦在確保訊息順利處理的過程中扮演不同的角色。它們中有些提供路由資訊以確定如何發送訊息,有些保存整個網路的重要訊息,而有些只是發送和接收訊息。

 

「訊息佇列」安裝期間,管理員決定哪些伺服器可以互相通信,並設定特定伺服器的特殊角色。構成此“訊息佇列”網路的電腦稱為“網站”,它們之間透過“網站連結”相互連接。每個網站連結都有一個關聯的“開銷”,它由管理員決定,指示了經過此網站連結傳遞訊息的頻率。

 

「訊息佇列」管理員也會在網路中設定一台或多台作為「路由伺服器」的電腦。路由伺服器查看各網站連結的開銷,確定經過多個網站傳遞訊息的最快、最有效的方法,以此決定如何傳遞訊息。

 

2. 隊列類型(Queue Type)

有兩種主要的隊列類型:由您或網路中的其他使用者建立的隊列和系統隊列。

使用者建立的佇列可能是以下任何一種佇列:

「公共佇列」在整個「訊息佇列」網路中複製,並且有可能由網路連線的所有網站存取。

「專用佇列」不在整個網路中發布。相反,它們僅在所駐留的本機電腦上可用。專用佇列只能由知道佇列的完整路徑名或標籤的應用程式存取。

「管理佇列」包含確認在給定「訊息佇列」網路中發送的訊息回執的訊息。指定希望 MessageQueue 元件使用的管理佇列(如果有的話)。

「回應佇列」包含目標應用程式接收到訊息時傳回給發送應用程式的回應訊息。指定希望 MessageQueue 元件使用的回應佇列(如果有的話)。

 

系統產生的隊列一般分為以下幾類:

「日記隊列」可選擇性地儲存發送訊息的副本和從佇列中移除的訊息副本。每個「訊息佇列」用戶端上的單一日記佇列儲存從該電腦傳送的訊息副本。在伺服器上為每個佇列創建了一個單獨的日記佇列。此日記追蹤從該佇列中移除的訊息。

「死信佇列」儲存無法傳遞或已過期的訊息的副本。如果過期或無法傳遞的訊息是事務性訊息,則儲存在一個特殊的死信佇列中,稱為「事務性死信佇列」。死信儲存在過期訊息所在的電腦上。有關超時期限和過期訊息的更多信息,請參見預設訊息屬性。

「報告佇列」包含指示訊息到達目標所經過的路由的訊息,也可以包含測試訊息。每台計算機上只能有一個報告佇列。

「專用系統佇列」是一系列儲存系統執行訊息處理作業所需的管理和通知訊息的專用佇列。

在應用程式中進行的大多數工作都涉及存取公共佇列及其訊息。但是,根據應用程式的日記記錄、確認和其他特殊處理需要,在日常操作中很可能要使用幾種不同的系統佇列。

 

3. 同步和非同步通訊(Synchronous VS. Asynchronous Communication)

佇列通訊天生就是非同步的,因為將訊息傳送到佇列和從佇列中接收訊息是在不同的進程中完成的通訊。另外,可以非同步執行接收操作,因為要接收訊息的人可以對任何給定的佇列呼叫 BeginReceive 方法,然後立即繼續其他任務而不用等待答案。這與人們所了解的「同步通訊」截然不同。

 

在同步通訊中,要求的發送方在執行其他任務前,必須等待來自預定接收方的回應。發送方等待的時間完全取決於接收方處理請求和發送回應所花費的時間。

 

4. 同訊息佇列互動(Interacting with Message Queues)

訊息處理和訊息為基於伺服器的應用程式元件之間的進程間通訊提供了強大且靈活的機制。同組件間的直接調用相比,它們具有若干優點,其中包括:

穩定性 — 組件失敗對訊息的影響程度遠小於組件間的直接調用,因為訊息儲存在隊列中並一直留在那裡,直到被適當地處理。訊息處理同事務處理相似,因為訊息處理是有保證的。

訊息優先級 — 更緊急或更重要的訊息可在相對不重要的訊息之前接收,因此可以為關鍵的應用程式保證足夠的回應時間。

脫機能力 — 發送訊息時,它們可被送到臨時佇列中並一直留在那裡,直到被成功地傳遞。當因任何原因對所需佇列的存取權不可用時,使用者可以繼續執行操作。同時,其他操作可以繼續進行,如同訊息已經處理了一樣,這是因為網路連線恢復時訊息傳遞是有保證的。

事務性訊息處理 — 將多個相關訊息耦合為單一事務,確保訊息按順序傳遞、只傳遞一次並且可以從它們的目標佇列中成功檢索。如果出現任何錯誤,將取消整個事務。

安全性 — MessageQueue 元件基於的訊息佇列技術使用 Windows 安全性來保護存取控制,提供審核,並對元件傳送和接收的訊息進行加密和驗證。

 

5. 在.Net環境下編寫簡單的Message Queue程式

(1)先安裝Message Queuing Services

透過Control Panel,「Add/Remove Programs」 – “Addon/Remove 。

MSMQ可以安裝為工作群組模式或網域模式。如果安裝程式沒有找到一台執行提供目錄服務的訊息佇列的伺服器,則只可以安裝為工作群組模式,此電腦上的「訊息佇列」只支援建立專用佇列和建立與其他執行「訊息佇列」的計算機的直接連接。

 

(2)設定MSMQ

開啟Computer Management – Message Queuing,在Private Queues下建立MSMQDemo佇列

 

(3)設定為「簡單示範MS」中所寫程式碼的物件。包裝。 MessageQueue 類別提供「訊息佇列」佇列的引用。可以在MessageQueue 建構函式中指定一個連接到現有資源的路徑,或可在伺服器上建立新佇列。在呼叫Send、Peek 或 Receive 之前,必須將 MessageQueue 類別的新實例與某個現有佇列關聯。

 

MessageQueue 支援兩種類型的訊息檢索:同步和非同步。同步的 Peek 和 Receive 方法讓進程執行緒以指定的間隔時間等待新訊息到達佇列。非同步的 BeginPeek 和 BeginReceive 方法允許主應用程式任務在訊息到達佇列之前,在單獨的執行緒中繼續執行。這些方法透過使用回調物件和狀態物件進行工作,以便在執行緒之間進行資訊通訊。

// Send Message

private void btnSendMessage_Click(object sender, System.EventArgs e)

{ System.Messaging.MessageQueue queue = new System.Messaging.MessageQueue(".\Private$ \MSMQDemo");

 

       // Create message

       System.Message0.Message       System.Message0.Message      message.Body = txtMessage.Text.Trim();

       message.Formatter = new System.Messaging.XmlMessageFormatter(new Type[] {typeof(string)});

  queue.Send(message);

}

 

// 接收訊息

private void btnReceiveMessage_Click(object sender, System.EventArgs e)

{

aging.MessageQueue queue = new System.Messaging.MessageQueue(".\Private$\ MSMQDemo ");

 

       // 接收訊息,且同步的Receive方法阻止目前執行線程,

          message.Formatter = new System. Messaging.XmlMessageFormatter( new 類型[] {typeof(string)});

       txtReceiveMessage.Text = message.Body.ToString();

}

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!