『大型網站技術架構』(五):可擴展架構
擴展性和伸縮性:
- 擴展性(Extensibility): 指對現有系統影響最小的情況下,系統功能可持續擴展或提升的能力。目標是當系統新增功能時,不需要對現有系統的結構和代碼進行修改。
- 伸縮性(Scalability):指系統能夠通過增加/減少自身資源規模的方式增強/減少自己計算處理事務的能力。目標是利用集羣的方式增加服務器數量,提高系統的整體事務吞吐能力,實現線性伸縮性。
一、構建可擴展的網站架構
終極目標:系統間低耦合。如何分解系統的各個模塊、如何定義各個模塊接口、如何複用組合不同的模塊構造一個完整的系統。
核心思想:模塊化,並在此基礎上降低模塊間耦合性,提高模塊複用性。
二、利用分佈式消息隊列降低系統耦合性
分佈式消息隊列通過消息對象分解系統耦合性,不同子系統處理同一個消息。
事件驅動架構
定義:事件驅動架構(Event Driven Architecture)通過在低耦合的模塊之間傳輸事件消息,以保持模塊的鬆散耦合,並藉助事件消息的通信完成模塊間合作。
典型的EDA架構比如生產者消費者模式。利用分佈式消息隊列的發佈-訂閱模式工作。生產者只需生產消息到隊列,消費者從隊列獲取消息進行處理。新增業務,只要對某類消息感興趣,即可訂閱該消息,對原有系統和業務沒有任何影響。
三、利用分佈式服務打造可複用的業務平臺
分佈式服務通過接口分解系統耦合性,不同子系統通過相同的接口描述進行服務調用。
巨無霸系統帶來的問題:
- 編譯、部署困難
- 代碼分支管理困難:多個團隊共同維護一份代碼。
- 數據庫連接容易耗盡:數據庫連接數與應用數量成正比。
- 新增業務困難:老人不敢碰,新人不能接。
解決方法:拆分、模塊獨立部署
- 縱向拆分:將大應用拆分爲多個小應用。
- 橫向拆分:將複用業務拆分出來,獨立部署爲分佈式服務,新增業務只需調用這些分佈式服務,不需要依賴具體的模塊代碼。
Web Service與企業級分佈式服務
Web Service: 服務提供者通過WSDL描述服務(接口),客戶端通過WSDL生成客戶端調用代碼,通過SOAP協議與服務提供者通信,傳輸層協議可以是HTTP、SMTP、TCP等。
缺點:
- 臃腫的註冊與發現機制
- 低效的XML序列化手段
- 開銷相對較高的HTTP遠程通信
- 複雜的部署與維護手段
大型網站分佈式服務的需求
- 服務註冊與發現
- 負載均衡:支持服務請求者使用可配置的負載均衡算法訪問服務。
- 失效轉移
- 高效的遠程通信
- 整合異構系統
- 對應用最小侵入:適應服務架構的進化和反覆(分佈式或集中式部署)。
- 版本管理:支持服務接口的多版本。
- 實時監控
分佈式服務框架設計
- Thrift(遠程服務調用框架):Facebook用它管理其分佈式服務(註冊、發現和調用),但是未開源基於Thrift的分佈式服務框架。
- Dubbo:阿里開源的分佈式服務框架,較爲成熟。
四、可擴展的數據結構
NoSQL: 寬列存儲模型、ColumnFamily(列族)設計、面向列族的稀疏矩陣存儲格式
五、利用開放平臺建設網站生態圈
開放平臺架構:
- API接口:RESTful、Web Service、RPC等。
- 協議轉換:將API輸入轉成內部服務可識別的形式,將內部服務返回值封裝成API格式。
- 安全:身份識別、權限控制。
- 審計:監控、計費。
- 路由:將開放平臺訪問路由映射到具體的內部服務。
- 流程:將一組離散的服務組織成一個上下文相關的新服務,隱藏服務細節,提供統一接口。
--EOF--