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

分散式 CommandBus:MSMQ 實作非同步/同步雙模式、Session 傳遞與多實例擴展

     編輯:關於.NET

針對前端 Server 需將 Command 分派至多個後端 App Server(如 Order、Warehouse)的分散式場景,本文展示基於 MSMQ 的 CommandBus 實作,支援:

  • 非同步發送 + 事件回調 / 同步阻塞等待回應
  • 單一 Command 多實例並行處理(水平擴展)
  • 後端讀取前端 Web Session 值(僅讀)
  • 大訊息 (>3.5MB) 自動切換網路共享傳輸

架構拓撲

分散式 CommandBus 架構圖

圖 1 三層架構:前端 → CommandBus (MSMQ) → 多 App Server

前端發送 API

// 非同步
var cmd = new ACommand { Tag = "aaa" };
var bus = new CommandBusDistributer<ACommand, ACommandResult>();
bus.ResultCatched += (sender, result) => { /* 處理回應 */ };
bus.SendRequest(cmd);

// 同步阻塞
var result = bus.WaitResponse(); // 內部以 EventWaitHandle 等待

配置檔關鍵區段

<CommandBusSetting>
  <AutoCreateIfNotExists>true</AutoCreateIfNotExists>
  <WebSessionSupport>true</WebSessionSupport>
  <CommandQueue>PC-20130606HCVP\private$\Commands_{0}</CommandQueue>
  <ResponseQueue>PC-20130606HCVP\private$\CommandResponses</ResponseQueue>
  <NetworkLocation>\\PC-20130606HCVP\network</NetworkLocation>
</CommandBusSetting>

Command 定義與 QueueName 屬性

[QueueName("ACommand")] // 可選,預設類名為佇列名
public class ACommand : BaseCommand {
    public string Tag { get; set; }
}

後端 App Server 實作模式

後端專案結構

圖 2 CommandHandlerHost 專案結構

// Host 1
static void Main() {
    Thread.Sleep(2000);
    var listener = new CommandHandlerListener();
    listener.AddHandler(new TestCommandHandlers());
    listener.AddHandler(new Test2CommandHandlers());
    listener.Start();
    Console.ReadKey();
}

// Handler 實作
public class TestCommandHandlers : 
    ICommandHandler<ACommand, ACommandResult>,
    ICommandHandler<BCommand, BCommandResult> {
    
    public ACommandResult Handler(ACommand cmd, ISessionContext session) { ... }
    public BCommandResult Handler(BCommand cmd, ISessionContext session) {
        if (session != null) {
            var val = session.GetWebSession("key1"); // 讀取前端 Session
        }
        ...
    }
}

效能基準測試

效能測試圖表

圖 3 吞吐量與延遲測試結果

已整合至 A2D Framework,可直接引用 NuGet 套件使用。


作者:玄魂
出處:https://www.cnblogs.com/xuanhun/

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