之前有個案子有用到 Message Queuing (MSMQ) 技術,但國內似乎採用這種技術的人不多,網路上能找到的都以 MSDN / TechNet 與英文內容居多,不過 MSMQ 是從 NT 4.0 的時代就有的服務,到現在也都還一直是 Windows 內建服務的一部分,但我之前在使用時由於過於生疏,一度誤以為 MSMQ 是個不可靠的服務,後來才證明說 MSMQ 真的是穩定又有效的訊息佇列服務,以下是一些心得筆記。
佇列主要分 2 種
- 系統佇列 (System Queues)
- 主要用來處理系統相關的訊息。
- 包含的訊息是用來認可接收指定訊息佇列網路內所傳送的訊息。
- 使用者佇列
使用者可用來建立訊息的佇列又分 4 種類型
- 私用佇列 (Private Queues)
- 可以從遠端主機傳送訊息到本機的佇列,但私用佇列只能從本機讀取訊息!
- 可以設定訊息存取的安全性與使用權限 !
- 私用佇列只能由知道佇列完整路徑名稱或標籤 (Label) 的應用程式存取。
- 系統管理佇列 (Administration queues)
- 包含的訊息是用來認可接收指定訊息佇列網路內所傳送的訊息。
- 公用佇列 (Public Queues)
- 回應佇列 (Response queues)
- 包含的回應訊息會在目的應用程式接收訊息時傳回至傳送應用程式。
訊息傳遞的方式
透過 Message Queuing COM Components 或 .NET 的 System.Messaging 命名空間 傳送訊息都會先將訊息送入本機的 傳出佇列(Outgoing Queues) 然後才透過本機的 MSMQ 服務將訊息轉送到目的地,目的地可以是本機的 私用佇列(Private Queues) 或 遠端的 私用佇列(Private Queues) 或 其他類型的使用者佇列。
這觀念是我碰了好多釘子才知道的,要看訊息有沒有轉送到目的地只要點選如上圖 傳出佇列(Outgoing Queues) 的節點,然後看右側視窗是否有未完成的訊息要轉送,或傳遞過程中是否有留下的錯誤訊息。
如何表達 MSMQ 傳送路徑
這裡有篇簡單的文章說明如何利用 .NET 透過 MSMQ 傳送訊息
表達 MSMQ 傳送路徑有分兩種方式,表達的名稱稱為 FormatName,大致的格式如下:
- PUBLIC=QueueGUID
- DIRECT=Protocol:ComputerAddress\QueueName
- DIRECT=OS:ComputerName\private$\QueueName
- PRIVATE=ComputerGUID\QueueNumber
對於想要直接傳到訊息到目的地的寫法稱為 Direct Format Names,大致格式如下:
- DIRECT=AddressSpecification\QueueName (For public queues.)
- DIRECT=AddressSpecification\PRIVATE$\QueueName (For private queues.)
- DIRECT=AddressSpecification\SYSTEM$;computersystemqueue (Introduced in MSMQ 2.0)
- DIRECT=HTTP://URLAddressSpecification/msmq/QueueName (Introduced in MSMQ 3.0)
- DIRECT=HTTPS://URLAddressSpecification/msmq/QueueName (Introduced in MSMQ 3.0)
處理常見的 MSMQ 操作錯誤
請參考這篇文章:MessageQueueErrorCode Enumeration
其他與安全相關的文章
MSMQ 各版本與作業系統的對應
- MSMQ 1.0
- Microsoft® Windows NT® 4.0, Windows® 95, and Windows 98.
- MSMQ 2.0
- MSMQ 3.0
- Microsoft Windows XP Professional and members of the Windows Server 2003 family.
- MSMQ is also available with independent client functionality on computers running Windows CE 3.0.
- MSMQ 4.0
- Microsoft Windows Vista and members of the Windows Server 2008 family
- MSMQ 5.0
相關連結