本文為系列第二篇,提供從部署拓撲、耦合內聚、通訊模式、併發控制、資源管理、緩存策略、狀態管理、數據結構、數據訪問、異常處理到類設計的全維度架構審查清單,助力構建高性能、可擴展的 .NET 系統。
部署與體系結構
- 按需引入分佈式架構,避免不必要的跨進程/跨機調用開銷。
- 綜合性能、安全、互操作性選擇通訊機制 (Socket/WCF/Remoting/Web API)。
- 高頻交互組件部署在同一邊界內 (同進程/同機器),遵循就近原則。
- 設計預留縱向擴展 (Scale Up) 與橫向擴展 (Scale Out) 空間:邏輯分層、無親和性、支援負載均衡。
耦合與內聚
- 鬆耦合:組件間依賴抽象/介面,而非具體實現。
- 高內聚:邏輯相關的類/方法聚合在同一模組。
- 限制晚期綁定:僅在必要時 (如插件系統) 使用,運行時綁定損耗性能。
通訊效率
- 介面設計拒絕「對話式」細粒度調用,合併為批量操作。
- 僅在必要時遠程調用:客戶端驗證、緩存、批量處理最小化遠程呼叫。
- 優化遠程數據交換格式 (壓縮、二進制、DTO 精簡)。
- 引入消息隊列解耦長耗時操作,採用「發後即忘」或異步模式。
- 優先 AppDomain 隔離替代進程隔離,降低上下文切換成本。
併發控制核心原則
- 禁用顯式逐請求創建線程,全面採用 CLR 線程池 (或自定義池)。
- 按需線程安全:僅標記確需共享的類型為線程安全,避免過度同步。
- 鎖粒度權衡:過細增加複雜度,過粗降低併發度,尋找平衡點。
- 晚獲取、早釋放共享資源與鎖,縮短臨界區持有時間。
- 選擇恰當同步原語 (
lock/Monitor/Semaphore/ReaderWriterLock) 及事務隔離級別。
- IO 密集型任務用異步模式 (
Begin/End、APM、TAP),CPU 密集型避免無謂異步開銷 (除非為釋放 UI/關鍵線程)。
資源管理與緩存策略
- 設計支援對象池 (連接池、線程池、大對象池),晚取早還。
- 緩存「獲取/計算/渲染昂貴」的數據:靜態頁、輸出片段、SP 參數、查詢結果。
- 拒絕緩存高波動數據;選擇合適存儲位置 (進程內/分佈式/磁盤) 及過期策略 (滑動/絕對/依賴)。
狀態管理鐵律
- 首選無狀態組件:支援任意負載均衡算法,擴展無痛。
- 若必須有狀態:Remoting 用 SingleCall SAO,Web Service 用無狀態編程模型,Enterprise Services 用無狀態組件配合對象池。
- 狀態對象必須可序列化 (跨層傳輸/持久化需求)。
- 審慎評估 ViewState 體積影響,分級關閉 (應用/頁面/控件)。
- 依據併發 Session 數與平均數據量選擇 Session 存儲模式 (InProc/StateServer/SQLServer/Custom)。
數據結構、訪問與異常處理
- 選擇最適數據結構 (List/Dictionary/HashSet/Queue 等),僅在極必要時自定義集合並實現
IEnumerable。
- 跨層傳輸用最高效格式 (DTO/匿名類/壓縮),權衡帶寬與 CPU。
- 數據訪問:參數化存儲過程、僅取所需、大結果集分頁、BLOB 分塊讀寫、重複代碼下沉 Helper 類。
- 異常不用於控制業務流程;結構化異常處理 (try/catch/finally) 替代錯誤碼;精準捕獲特定異常,避免吞噬。
類設計準則
- 類封裝其操作的數據 (高內聚)。
- 介面用於版本控制與多態 (跨類共同功能),避免濫用顯式介面。
- 非必要不加
virtual (密封預設,按需開放)。
- 優先方法重載替代可變參數 (
params),提升可讀性與類型安全。