軟件架構設計學習總結(13):大型網站技術架構(七)網站的可擴展性架構
擴展性是指對現有系統影響最小的情況下,系統功能可持續擴展或提升的能力。
設計網站可擴展架構的核心思想是模塊化,並在此基礎上,降低模塊間的耦合性,提供模塊的復用性。模塊通過分布式部署,獨立的模塊部署在獨立的服務器上(集群)從物理上分離模塊之間的耦合關系。
模塊分布式部署以後具體聚合方式主要有分布式消息隊列和分布式服務。
1、利用分布式消息隊列降低系統耦合性
如果模塊之間不存在直接調用,那麽新增模塊或者修改模塊對其他模塊影響最小,這樣系統的可擴展性無疑更好一些。
事件驅動框架:通過在低耦合的模塊之間傳輸事件消息,以保持模塊的松散耦合,並借助事件消息的通信完成模塊間合作,典型的架構就是生產者消費者模式
消息隊列利用發布-訂閱模式工作,消息發送者發布消息,一個或者多個消息接收者訂閱消息。
由於消息發送者不需要等待消息接受者處理數據就可以返回,系統具有更好的響應延遲;同時,在網站訪問高峰,消息可以暫時存儲在消息隊列中等待處理,減輕數據庫等後端存儲的負載壓力。
目前開源的和商業的分布式消息隊列產品有很多,比較著名的有Apache ActiveMQ等,如下是分布式消息隊列的架構原理:
2、利用分布式服務打造可復用的業務平臺
使用分布式服務是降低系統耦合性的另一個重要手段。如果說分布式消息隊列通過消息對象分解系統耦合性,不同子系統處理同一個消息;那麽分布式服務則通過接口分解系統耦合性,不同子系統通過相同的接口描述進行服務調用。
大型網站分布式服務的需求與特點:
- 負載均衡
- 失效轉移
- 高效的遠程通信
- 整合異構系統
- 對應用最小入侵
- 版本管理
- 實時監控
目前國內有較多成功實施案例的開源分布式服務框架是阿裏巴巴的Dubbo,下圖是Dubbo的架構原理:
服務消費程序通過服務接口使用服務,而服務接口通過代理加載具體服務,具體服務可以是本地的代碼模塊,也可以是遠程的服務,因此對應用較小入侵;應用程序需要調用服務接口,服務框架根據配置自動調用本地或遠程實現。
服務框架客戶端模塊通過服務註冊中心加載服務提供者列表(服務提供者啟動後主動向服務註冊中心註冊自己可提供的服務接口列表),查找需要的服務接口,並根據配置的負載均衡策略將服務調用請求發送到某臺服務提供者服務器。如果服務調用失敗,客戶端模塊會自動從服務提供者列表選擇一個可提供同樣服務的另一臺服務器重新請求服務,實現服務的自動失效轉移,保證高可用服務。
3、利用開放平臺建設網站生態圈
大型網站為了更好的服務自己的用戶,開放更多的增值服務,會把網站內部的服務封裝成一些調用接口開放出去,共外部的第三方開發者使用,這個提供開放接口的平臺被稱作開放平臺。
開放平臺是網站內部和外部交互的接口,外部需要面對眾多的第三方開發者,內部需要面對網站內諸多的業務服務。雖然每個網站的業務場景和需求都不相同,但開發平臺的架構設計卻大同小異,如下圖所示:
API接口:是開發平臺暴露給開發者使用的一組API,其形式可以是RESTfull,WebService,RPC等各種形式。
協議轉換:將各種API輸入轉換成內部服務可以識別的形式,並將內部服務的返回封裝成API格式。
安全:除了一般應用需要的身份識別、權限控制等安全手段,開放平臺還需要分級的訪問帶寬限制,以保證資源被公平合理的使用。
審計:記錄第三方應用的訪問情況並進行監控、計費等。
路由:將開放平臺的各種訪問路由映射到具體的內部的服務。
流程:將一組離散的服務組織成一個上下文相關的新服務,隱藏服務細節,提供統一接口供開發者調用。
軟件架構設計學習總結(13):大型網站技術架構(七)網站的可擴展性架構