首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> 關於.NET

WCF 實戰 (12):MSMQ 可靠訊息傳遞 — 離線作業、異步解耦與可靠性機制完整解析

     編輯:關於.NET

一、為何選擇 MSMQ?

分散式系統常面臨連線不穩、尖峰負載、跨平台整合等挑戰。MSMQ 提供三大核心優勢:

  1. 離線支援 (Disconnected):訊息暫存本地佇列,連線恢復自動轉發,用戶無感知。
  2. 天生異步 (One-way Async):發送即回覆,服務端依自身排程處理,可錯峰批次處理 (如深夜跑批)。
  3. 企業級可靠性:超時機制、確認機制 (Acknowledgement)、日誌機制 (Journaling)、死信佇列 (Dead-letter Queue) 多重保障。

二、WCF 內建兩種 MSMQ Binding

Binding適用場景程式模型
NetMsmqBindingWCF 端點間通訊,功能與一般 binding 一致標準 Service Contract / Data Contract
MsmqIntegrationBinding整合現有非 WCF MSMQ 應用Operation 僅接受 MsmqMessage<T> 參數

Client-Service 通訊圖

三、MSMQ 與交易

  • 訊息佇列交易 (MQ Transaction):單一或多佇列操作原子化。
  • DTC 分散式交易:跨資源 (如 SQL Server + MSMQ) 時使用。
  • WCF 中 Client 與 Service 因時間脫鉤,分屬不同交易範圍。

交易範圍分離圖

四、完整範例:NetMsmqBinding 訂單遞交

專案結構 (4 層)

Solution 結構

1. Contract (共用組件)

[DataContract] [KnownType(typeof(OrderItem))]
public class Order { /* OrderNo, OrderDate, Supplier, Items... */ }

[DataContract] public class OrderItem { /* ProductID, Name, Price, Qty */ }

[ServiceContract]
public interface IOrderProcessor
{
    [OperationContract(IsOneWay = true)]
    void Submit(Order order);
}

2. Service 實作

public class OrderProcessorService : IOrderProcessor
{
    public void Submit(Order order) => Console.WriteLine($"收到訂單 {order.OrderNo}");
}

3. Hosting (自宿主 + 佇列建立)

// App.config 關鍵:msmqAuthenticationMode="None" 方便本機測試
// Program.cs
string path = @".\private$\orders";
if (!MessageQueue.Exists(path)) MessageQueue.Create(path, true); // true = 支援交易

using (var host = new ServiceHost(typeof(OrderProcessorService)))
{
    host.Open(); Console.Read();
}

4. Client (搭配 TransactionScope)

using (var scope = new TransactionScope(TransactionScopeOption.Required))
{
    channel.Submit(order); // 送入佇列
    scope.Complete();      // 交易提交,訊息才真正進入目的佇列
}

五、執行驗證

Host 啟動後監聽,Client 送出訂單,主控台輸出:

Host 接收訂單輸出

六、關鍵設定提醒

  • exactlyOnce="false":非精確一次傳遞 (需 MSMQ 3.0+ 且啟用 AD 才支援 exactlyOnce)。
  • msmqAuthenticationMode="None" + msmqProtectionLevel="None":開發環境免去 AD 依賴。
  • 佇列路徑格式:.\private$\queueName (本機私有佇列)。

總結

MSMQ 為 WCF 提供了脫機、異步、高可靠的傳輸通道。搭配 NetMsmqBinding 幾乎零學習成本即可接入現有 WCF 開發流程,是構建鬆耦合、高擴展性分散式系統的利器。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved