在企業級 B/S 系統架構中,除了安全性與事務完整性,性能始終是核心挑戰。面對高併發訪問、龐大數據流量與服務器負載,單純依賴硬件升級遠遠不夠,軟件層面的設計合理性才是關鍵。雖然分層架構在一定程度上增加了數據訪問的開銷,但其帶來的可維護性、擴展性收益遠超性能損耗。優化路徑除數據庫層面的連接池、索引、查詢優化、分庫策略(如 PetShop 將訂單與庫存拆分至獨立庫)外,軟件層面的多線程與異步處理同樣關鍵。
PetShop 4.0 引入 Microsoft Message Queue (MSMQ) 實現異步寫入:訂單數據先入隊列,避免即時數據庫交互帶來的阻塞;後台處理程序 OrderProcessor 在系統閒時批量落庫。這一機制顯著提升前台響應速度,同時保證數據不丟失——MSMQ 持久化隊列特性天然承擔了緩衝職責。
消息處理體系遵循「面向接口編程」原則,拆分為四大塊:
IOrder 接口,僅暴露 Send/Receive 契約PetShopQueue 基類(封裝隊列收發邏輯)與 Order 實現類
PetShopQueue 以虛方法 Receive()/Send() 封裝 System.Messaging.MessageQueue 操作,統一異常處理與超時控制。Order 類繼承基類並實現 IOrder,關鍵在於事務類型的差異化配置:
public new OrderInfo Receive() {
base.transactionType = MessageQueueTransactionType.Automatic; // 分布式事務
return (OrderInfo)((Message)base.Receive()).Body;
}
public void Send(OrderInfo orderMessage) {
base.transactionType = MessageQueueTransactionType.Single; // 單一事務,優化性能
base.Send(orderMessage);
}
注意 new 關鍵字隱藏而非覆寫基類方法,這意味著若以基類類型持有實例(PetShopQueue q = new Order();),調用將解析至基類實現。PetShop 通過接口引用(IOrder order = new Order();)規避此風險。
QueueAccess.CreateOrder() 利用反射根據配置節 OrderMessaging 動態加載程序集並實例化:
private static readonly string path = ConfigurationManager.AppSettings["OrderMessaging"];
public static IOrder CreateOrder() {
string className = path + ".Order";
return (IOrder)Assembly.Load(path).CreateInstance(className);
}
配置範例:<add key="OrderMessaging" value="PetShop.MSMQMessaging"/>。若需替換實現(如 PetShop.SpecialMSMQMessaging),僅修改配置即可,無需重編譯部署,體現了開閉原則。
業務層 OrderAsynchronous 通過工廠獲取 IOrder 實例,Insert 直接委託 Send。而 PetShop.BLL.Order 引入策略接口 IOrderStrategy,區分同步(OrderSynchronous)與異步(OrderAsynchronous)插入路徑:
public void Insert(OrderInfo order) {
ProcessCreditCard(order); // 信用卡處理
orderInsertStrategy.Insert(order); // 策略委託
}
策略實現同樣由配置文件決定(OrderStrategyAssembly/OrderStrategyClass),OrderProcessor 獨立進程使用 App.config 指向同步策略,確保後台批量處理的事務一致性。
核心方法 ProcessOrders() 在無限循環中:
batchSize * transactionTimeout)TransactionScope 保護下,按批次從隊列接收訂單(ReceiveFromQueue),超時即退出本批Insert 入庫,計數器累加ts.Complete() 提交事務,輸出執行統計此設計平衡了吞吐量與資源佔用,批次大小與超時參數可通過配置調優。
除異步化,MSMQ 還是異構系統集成的橋樑。某汽車廠商項目中:經銷商 .NET 客戶端(SQL Server)通過 MSMQ 傳遞數據至隊列服務器,同步寫入本地庫並經 FTP 轉文件服務器,再由 IBM EAI 定時抽取轉入 Oracle EBS。統一接口規範使 .NET 與 Java/Oracle 生態無縫對接,消息隊列實現了平台無關的數據流轉。