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

WCF 分散式開發步步為贏 (13):MSMQ 訊息佇列實現服務離線操作

     編輯:關於.NET

前言

MSMQ (Microsoft Message Queuing) 提供可靠的非同步、離線訊息傳遞。WCF 透過 NetMsmqBinding 整合 MSMQ,賦予服務「高可用性、負載平緩、作業補償」能力。

1. MSMQ 基本概念

  • 發送者將訊息放入佇列,接收者稍後從佇列取出處理。
  • 支援公用佇列(需網域控制器)、私有佇列(本機可見,工作群組適用)、管理/回應佇列。

2. WCF 整合 MSMQ 四大優勢

  1. Availability 可用性:客戶端無需即時連線服務,訊息暫存佇列,服務上線自動處理。
  2. Disjoint 分解:大任務拆解為多個獨立訊息,提升吞吐量。
  3. Compensating 補償:多業務事務失敗時,提供獨立補償作業。
  4. Load Leveling 負載平緩:尖峰請求入佇列,離峰消費,平滑系統負載。

3. 通訊架構

WCF MSMQ 通訊架構圖

  • 客戶端呼叫 → 封裝為 MSMQ 訊息 → 寫入目標佇列。
  • 服務宿主啟動通道監聽器 → 偵測佇列訊息 → 分發器調度至服務實例。
  • 服務離線時,訊息滯留佇列,待上線自動消費。

4. XP 工作群組環境配置要點

  1. 安裝 MSMQ 服務(控制台 → 新增/移除程式 → Windows 元件)。
  2. 僅使用「私有佇列」,無需網域控制器。
  3. 關閉安全模式:<security mode="None">,避免憑證與 AD 依賴。

5. 完整範例代碼

5.1 服務契約:單向操作

[ServiceContract(Namespace = "https://www.cnblogs.com/frank_xl/")]
public interface IWCFMSMQService {
    [OperationContract(IsOneWay = true)]
    void SayHelloMSMQ(string name);
}

public class WCFMSMQService : IWCFMSMQService {
    public WCFMSMQService() {
        Console.WriteLine("Instance created at {0}", DateTime.Now);
    }
    public void SayHelloMSMQ(string name) {
        Console.WriteLine("Hello! {0} at {1}", name, DateTime.Now);
    }
}

5.2 宿主配置

<services>
  <service name="WCFService.WCFMSMQService" behaviorConfiguration="WCFService.WCFServiceBehavior">
    <endpoint address="net.msmq://localhost/Private/FrankWCFMSMQ"
              binding="netMsmqBinding" bindingConfiguration="msmq"
              contract="WCFService.IWCFMSMQService" />
    <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
    <host><baseAddresses><add baseAddress="https://localhost:8001/" /></baseAddresses></host>
  </service>
</services>

<bindings>
  <netMsmqBinding>
    <binding name="msmq" durable="false" exactlyOnce="false">
      <security mode="None">
        <transport msmqProtectionLevel="None"/>
        <message clientCredentialType="None"/>
      </security>
    </binding>
  </netMsmqBinding>
</bindings>

5.3 客戶端測試

var proxy = new WCFMSMQServiceClient("NetMsmqBinding_IWCFMSMQService");
Console.WriteLine("First Call at {0}", DateTime.Now);
proxy.SayHelloMSMQ("Frank");
Thread.Sleep(2000);
Console.WriteLine("Second Call at {0}", DateTime.Now);
proxy.SayHelloMSMQ("Frank Xu");
Thread.Sleep(2000);
Console.WriteLine("Last Call at {0}", DateTime.Now);
proxy.SayHelloMSMQ("Frank Xu Lei");

6. 執行驗證

  1. 先啟動客戶端發送三次呼叫(服務未啟動)。
  2. 開啟「電腦管理 → 服務 → 私有佇列」查看訊息已入佇列。
    私有佇列訊息截圖
  3. 等待數分鐘後啟動服務宿主,觀察主控台輸出時間戳記,確認離線訊息被正確處理。
    服務上線處理離線訊息

7. 開發注意事項

  • 宿主啟動前檢查佇列是否存在,避免讀取錯誤。
  • 生產環境需啟用傳輸/訊息安全,配置憑證與 AD。
  • 支援異動佇列 (exactlyOnce="true")、持久訊息 (durable="true") 以確保不遺失。
  • 環境需求:XP Pro / .NET 3.0+ / VS2008 / MSMQ 私有佇列元件。

總結

WCF + MSMQ 以最小代碼變更賦予服務離線處理能力,是實現高可用、可擴充分散式架構的關鍵技術之一。

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