message queuing

message queuing即訊息佇列,應用程式開發人員可以通過傳送和接收訊息方便地與應用程式進行快速可靠的通信。

訊息佇列(Message Queue)簡介及其使用
利用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” – “Add/Remove Windows Components”步驟安裝MSMQ。
MSMQ可以安裝為工作組模式或域模式。如果安裝程式沒有找到一台運行提供目錄服務的訊息佇列的伺服器,則只可以安裝為工作組模式,此計算機上的“訊息佇列”只支持創建專用佇列和創建與其他運行“訊息佇列”的計算機的直接連線。
(2)配置MSMQ
打開Computer Management – Message Queuing,在Private Queues下創建MSMQDemo佇列
(3)編寫代碼-簡單演示MSMQ對象
MessageQueue類是“訊息佇列”周圍的包裝。MessageQueue類提供對“訊息佇列”佇列的引用。可以在MessageQueue構造函式中指定一個連線到現有資源的路徑,或者可在伺服器上創建新佇列。在調用Send、Peek或Receive之前,必須將MessageQueue類的新實例與某個現有佇列關聯。
MessageQueue支持兩種類型的訊息檢索:同步和異步。同步的Peek和Receive方法使進程執行緒用指定的間隔時間等待新訊息到達佇列。異步的BeginPeek和BeginReceive方法允許主應用程式任務在訊息到達佇列之前,在單獨的執行緒中繼續執行。這些方法通過使用回調對象和狀態對象進行工作,以便線上程之間進行信息通訊。
// Send Message
privatevoidbtnSendMessage_Click(objectsender,System.EventArgse)
{
// Open queue
System.Messaging.MessageQueuequeue=newSystem.Messaging.MessageQueue(".\\Private$\\MSMQDemo");
// Create message
System.Messaging.Messagemessage=newSystem.Messaging.Message();
message.Body=txtMessage.Text.Trim();
message.Formatter=newSystem.Messaging.XmlMessageFormatter(newType[] {typeof(string)});
// Put message into queue
queue.Send(message);
}
// Receive Message
privatevoidbtnReceiveMessage_Click(objectsender,System.EventArgse)
{
// Open queue
System.Messaging.MessageQueuequeue=newSystem.Messaging.MessageQueue(".\\Private$\\MSMQDemo");
// Receive message,同步的Receive方法阻塞當前執行執行緒,直到一個message可以得到
System.Messaging.Messagemessage=queue.Receive();
message.Formatter=newSystem.Messaging.XmlMessageFormatter(newType[] {typeof(string)});
txtReceiveMessage.Text=message.Body.ToString();
}
Demo界面:
******
關於MSMQ訊息佇列介紹文字來自於MSDN.

相關詞條

熱門詞條

聯絡我們