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

Windows Azure AppFabric 服務總線緩衝區深度解析:架構、API 與 WCF 整合模式

     編輯:關於.NET

Windows Azure AppFabric 服務總線提供「緩衝區」功能:一個可定址的訊息暫存端點,支援發送者與接收者在時間與空間上的解耦。本文基於 MSDN Magazine 2010 年 5 月專欄,系統剖析緩衝區原則、管理 API、原始訊息收發、WCF 結構化封裝(BufferedServiceBusHost<T>/BufferedServiceBusClient<T>)、回應緩衝區模式與簡化輔助類別。

一、緩衝區核心特性

  • 非持久:訊息存於記憶體,服務總線故障會導致遺失。
  • 非交易性:不支援分散式交易。
  • TTL 短:預設 5 分鐘,上限 10 分鐘(MSMQ 預設 1 天)。
  • 容量小:最多 50 條訊息,單條上限 64 KB(MSMQ 4 MB)。
  • 溢位策略:唯一選項 RejectIncomingMessage(拒絕新訊息回報錯誤)。
  • 適用場景:短暫離線緩衝、非同步單向呼叫搭配回應緩衝區。

二、緩衝區原則


public class MessageBufferPolicy
{
    public DiscoverabilityPolicy Discoverability { get; set; } // 可發現性:Managers/Public
    public TimeSpan ExpiresAfter { get; set; }                // 訊息 TTL (1-10 分鐘)
    public int MaxMessageCount { get; set; }                  // 緩衝區深度 (1-50)
    public OverflowPolicy OverflowPolicy { get; set; }        // 唯一值 RejectIncomingMessage
    public AuthorizationPolicy Authorization { get; set; }    // 傳送/接收授權需求
    public TransportProtectionPolicy TransportProtection { get; set; } // None/AllPaths (預設 HTTPS)
}

三、管理 API:MessageBufferClient


// 建立緩衡區
MessageBufferClient.CreateMessageBuffer(credential, bufferUri, policy);
// 取得現有緩衝區
var client = MessageBufferClient.GetMessageBuffer(credential, bufferUri);
// 發送/接收原始 WCF Message
client.Send(message);
Message msg = client.Retrieve();
// 刪除/清除
client.DeleteMessageBuffer();

四、簡化管理:ServiceBusHelper

封裝常用操作:CreateBuffer(建立最大容量/TTL/公開可發現緩衝區)、VerifyBuffer(不存在則建立)、PurgeBuffer(重建清空)、DeleteBuffer。

五、WCF 結構化封裝:BufferedServiceBusHost<T>

解決原始 Message 程式設計繁瑣、非型別安全問題:

  • 建構子傳入緩衝區 URI 陣列。
  • 內部為每個服務契約介面建立 NetNamedPipeBinding 本地端點。
  • 後台執行緒輪詢緩衝區 Retrieve,將 Message 透過 IPC 導向對應本地端點。
  • 支援單例/每呼叫實例服務、除錯模式自動清除緩衝區、優雅關閉(發送特殊關閉訊息終止輪詢執行緒)。

// 使用範例
var host = new BufferedServiceBusHost<MyService>(
    new Uri("https://myns.servicebus.windows.net/MyBuffer"));
host.Open();

六、用戶端封裝:BufferedServiceBusClient<T>

  • 繼承自 InterceptorClientBase<T>,覆寫 PreInvoke 將呼叫序列化為 Message 發送至緩衝區。
  • 攔截 InvalidOperationException(訊息已發送不可重複發送)。
  • 提供 Enqueue(Action) 包裝 Lambda 呼叫,保持型別安全。

public class MyContractClient : BufferedServiceBusClient<IMyContract>, IMyContract
{
    public void MyMethod(int n) => Enqueue(() => Channel.MyMethod(n));
}

七、回應緩衝區模式

單向緩衝呼叫無法直接取得結果/錯誤,需雙緩衝區:

  1. 用戶端建立回應緩衝區,將位址與方法 ID 置於訊息標頭 (ResponseContext)。
  2. 服務端處理完成後,透過 ServiceBufferResponseBase<T> 將結果發送至回應緩衝區。
  3. 用戶端輪詢回應緩衝區取得結果。

// 用戶端
var proxy = new CalculatorClient(responseBufferUri);
proxy.Add(2, 3); // 單向呼叫
string methodId = proxy.Header.MethodId; // 取得關聯 ID

// 服務端
public void Add(int a, int b)
{
    int result = 0; ExceptionDetail error = null;
    try { result = a + b; }
    catch (Exception ex) { error = new ExceptionDetail(ex); }
    finally
    {
        new CalculatorResponseClient().OnAddCompleted(result, error); // 發送回應
    }
}

八、關鍵輔助類別

  • HeaderClientBase<T,H>:訊息標頭攜帶任意物件(如 ResponseContext)。
  • InterceptorClientBase<T>:提供 PreInvoke/PostInvoke 攔截點。
  • IServiceBusProperties:統一暴露 Credential 與 Addresses,供宿主/用戶端/回應代理共用憑證。

九、完整範例下載

MSDN Magazine 2010/05 範例程式碼:
Service Bus Buffers Sample

結語

服務總線緩衝區雖非完整佇列替代品,但在「短暫離線緩衝」與「非同步請求-回應」兩大模式下極具價值。透過 BufferedServiceBusHost/Client 封裝層,開發者可保留 WCF 結構化程式模型,同時享受雲端級鬆耦合通訊優勢。後續版本將引入路由器、真佇列、日誌診斷等功能,持續擴展混合雲整合能力。

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