Windows Azure AppFabric 服務總線提供「緩衝區」功能:一個可定址的訊息暫存端點,支援發送者與接收者在時間與空間上的解耦。本文基於 MSDN Magazine 2010 年 5 月專欄,系統剖析緩衝區原則、管理 API、原始訊息收發、WCF 結構化封裝(BufferedServiceBusHost<T>/BufferedServiceBusClient<T>)、回應緩衝區模式與簡化輔助類別。
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)
}
// 建立緩衡區
MessageBufferClient.CreateMessageBuffer(credential, bufferUri, policy);
// 取得現有緩衝區
var client = MessageBufferClient.GetMessageBuffer(credential, bufferUri);
// 發送/接收原始 WCF Message
client.Send(message);
Message msg = client.Retrieve();
// 刪除/清除
client.DeleteMessageBuffer();
封裝常用操作:CreateBuffer(建立最大容量/TTL/公開可發現緩衝區)、VerifyBuffer(不存在則建立)、PurgeBuffer(重建清空)、DeleteBuffer。
解決原始 Message 程式設計繁瑣、非型別安全問題:
NetNamedPipeBinding 本地端點。Retrieve,將 Message 透過 IPC 導向對應本地端點。
// 使用範例
var host = new BufferedServiceBusHost<MyService>(
new Uri("https://myns.servicebus.windows.net/MyBuffer"));
host.Open();
InterceptorClientBase<T>,覆寫 PreInvoke 將呼叫序列化為 Message 發送至緩衝區。InvalidOperationException(訊息已發送不可重複發送)。Enqueue(Action) 包裝 Lambda 呼叫,保持型別安全。
public class MyContractClient : BufferedServiceBusClient<IMyContract>, IMyContract
{
public void MyMethod(int n) => Enqueue(() => Channel.MyMethod(n));
}
單向緩衝呼叫無法直接取得結果/錯誤,需雙緩衝區:
ResponseContext)。ServiceBufferResponseBase<T> 將結果發送至回應緩衝區。
// 用戶端
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 結構化程式模型,同時享受雲端級鬆耦合通訊優勢。後續版本將引入路由器、真佇列、日誌診斷等功能,持續擴展混合雲整合能力。