在建筑領域是這樣描述模式的:每一個模式描述了一個在我們周圍不斷重復發(fā)生的問題以及該問題的解決方案核心。我們可以一次又一次地使用這個方案而不必做重復的工作。模式的關鍵是可重復性,問題和場景的可重復性帶來解決方案的可重復性。
目前的網站架構有一些共同的模式(思路與解決方案),它們已經被大型網站一再驗證,所以可以指導我們的架構設計。
1 分層
在橫向維度上把系統(tǒng)劃分為 3 層,每一層負責相對單一的職責,通過上層對下層的依賴與調用來構成一個完整的系統(tǒng)。
分層 | 描述 |
---|---|
應用層 | 負責具體業(yè)務與視圖展示。 |
服務層 | 為應用層提供服務支持。 |
數據層 | 提供數據訪問服務。 |
只要維持調用的接口不變,各層就可以根據具體問題,獨立演化發(fā)展。
在設計階段,必須合理的規(guī)劃各層之間的邊界和接口。在開發(fā)階段,必須嚴格遵循分層之間的約束,禁止跨層次調用(如應用層調服務層)以及逆向調用(如數據層調應用層)。
在實踐中,這些分層還可以進一步細分。比如應用層再分為視圖層與業(yè)務邏輯層;服務層分為數據接口層與邏輯處理層。
分層架構是邏輯上的劃分,所以可以部署在同一臺物理服務器上。但隨著業(yè)務的發(fā)展,必須會對這些層進行分離部署,即把這些層分別部署在不同的物理服務器上。
分層架構對于以后支持高并發(fā)并朝著分布式方向發(fā)展很重要,所以在早期,就應該采用分層架構哦O(∩_∩)O~
2 分割
分割指的是從縱向方面進行劃分。
把不同的業(yè)務服務包裝成高內聚低耦合的模塊單元,這樣不僅可以有助于開發(fā)和維護,也便于實現分布式部署。
3 分布式
分層與分割的目的之一是為了把這些模塊進行分布式部署,即把這些模塊部署在不同的服務器上,然后通過遠程調用協同工作。這就意味著有更多的服務器來提供同樣的服務,資源越多,那么支持的并發(fā)訪問量和數據量就越大,進而可以為更多的用戶服務。
但分布式也有一些缺點:
- 必須通過網絡調用服務,而這可能會對性能造成嚴重影響。
- 服務器越多,宕機的可能性就越大,造成可用性降低。
- 保持數據一致性很困難。
- 開發(fā)、管理與維護困難。
所以要根據實際情況量力而行哦O(∩_∩)O~
目前有這些分布式方案:
分布式應用與服務 - 可以改善性能和并發(fā)性、加快開發(fā)與發(fā)布速度、減少數據庫連接和不同的應用復用共同的服務。
分布式靜態(tài)資源 - 動靜分離,即把 js/css/圖片等靜態(tài)資源部署在獨立域名下,這不僅可以加快瀏覽器的并發(fā)加載速度,而且還可以讓負責用戶體驗的團隊獨立開發(fā)與維護這些靜態(tài)資源,實現分工合作。
分布式數據和存儲 - 大型網站需要處理以 P 為單位的海量數據,單臺計算機無法提供這么大的存儲空間,所以才要分布式存儲。像各種 NoSQL 產品幾乎都是分布式的。
分布式計算 - 處理在線業(yè)務之外,還有很大的一部分是用戶直觀感受不到的后臺業(yè)務,諸如構建搜索引擎索引、數據分析統(tǒng)計等。現在普遍使用 Hadoop 和 MapReduce 分布式計算框架進行這一類的批處理計算。它們的特點是移動計算,即把計算程序分發(fā)到數據所在的位置以加速計算工作。
4 集群
要對用戶訪問集中的模塊所部署的服務器建立集群,即多臺服務器部署相同應用,然后通過負載均衡設備共同對外提供服務。
這樣可以提供更好的并發(fā)能力,如果因為業(yè)務發(fā)展有了更多的并發(fā)用戶的時候,我們只要向集群中增加新機器即可。而且可以提高系統(tǒng)的可用性,所以在早期,也要至少部署兩臺服務器以構建一個集群,保證可用性。
5 緩存
緩存指的是把數據存放在距離計算最近的位置以加快處理速度,它是改善性能的第一手段。有這些緩存方法:
CDN - 內容分發(fā)網絡,用戶的請求會送達距離他最近的網絡服務商,這里緩存了網站的一些靜態(tài)資源,如果用戶的請求是這些資源,那么就可以很快地響應啦O(∩_∩)O~
反向代理 - 是前端架構的一部分,它部署在前端,當用戶的請求到達網站時,會最先訪問反向代理服務器,這些也緩存了網站的一些靜態(tài)資源,所以也會很快響應用戶的啦O(∩_∩)O~
本地緩存 - 緩存著熱點數據,應用程序可以直接從本機內存中讀取數據。
分布式緩存 - 如果網站的數據量非常龐大,那么即使只是緩存一小部分,所需要的內存也不是單機能夠承受的。為了解決這一問題,我們可以建立分布式緩存集群,應用程序通過網絡來訪問緩存數據。
使用緩存的前提條件是:
- 數據訪問的熱點并不均衡,即某些數據會被頻繁地訪問到,這些數據必須放入內存。
- 數據在某一個時間段內是有效的。如果很快過期,然后緩存數據就會因為失效而出現臟讀問題。
6 異步
異步指的是把一個業(yè)務分為多個階段,每個階段通過共享數據進行協作工作。
單個服務器內可以通過多線程共享內存隊列的方式實現異步;而在分布式系統(tǒng)中,多個服務器集群是通過分布式消息隊列實現異步的。
異步架構就是典型的生產者/消費者模式。它們不直接調用,只是共享數據結構。
異步消息隊列有這些特性:
提高系統(tǒng)可用性 - 消費者服務器發(fā)送故障,數據會在消息隊列服務器存儲堆積,但生產者服務器可以繼續(xù)處理業(yè)務,系統(tǒng)整體表現為正常。待消費者服務器恢復后,就可以繼續(xù)處理消息處理隊列中的數據。
加快響應速度 - 生產者服務器處理完業(yè)務請求后,就把數據寫入消息隊列,無須等待消費者服務器響應即可返回。
消除并發(fā)訪問高峰 - 消息隊列服務器可以吸納高峰期突然增加的訪問請求數據,然后由消費者服務器依次處理,這樣不會對整個負載造成太大的壓力。
注意:異步方式會對用戶體驗和業(yè)務流程造成影響,所以需要得到產品設計方面的支持。
7 冗余
服務器隨時可能出現故障,特別是服務器的規(guī)模比較大時,某臺服務器出現宕機幾乎是必然事件。所以為了保證服務與數據,就必須有一定數量的服務器冗余運行,數據冗余備份,這樣當某臺服務器宕機時,可以把其上的服務與數據轉移到其他機器上。
即使是訪問與負載很小的服務,也必須至少部署兩臺服務器構造一個小的集群,這樣才能實現服務的高可用。數據庫除了冷備份(定期備份、存檔保存)外,還要對數據庫進行主從分離,做熱備份。
為了防范地震等不可抗力導致服務癱瘓的情況,一些大型網站會對整個數據中心進行備份,在全球范圍內部署災備數據中心。程序與數據會實時同步到多個災備數據中心。
8 自動化
目前的自動化主要集中在發(fā)布與運行維護上。
很多故障都出現在發(fā)布環(huán)節(jié),所以實現發(fā)布自動化可以有效地減少故障。包括這些環(huán)節(jié):
- 自動化代碼管理 - 開發(fā)者只要提交自己代碼,系統(tǒng)就會自動為其創(chuàng)建開發(fā)分支,自動進行代碼合并。
- 自動化測試 - 系統(tǒng)自動把代碼部署到測試環(huán)境,啟動自動化測試用例進行測試,向相關人員發(fā)送測試報告,向系統(tǒng)反饋測試結果。
- 自動化安全檢測 - 對代碼進行靜態(tài)安全掃描并部署到安全測試環(huán)境,進行安全攻擊測試,評估系統(tǒng)的安全性。
- 自動化部署 - 把代碼自動部署到線上生產環(huán)境。
- 自動化監(jiān)控 - 對服務器進行心跳檢測,監(jiān)控它的各項性能指標和應用程序的關鍵數據指標。如果發(fā)現異常,就進行報警。然后進行失效轉移,把失效的服務器從集群中隔離。故障消除后,在進行失效恢復。遇到訪問高峰,進行降級,即拒絕部分請求以及關閉一部分不重要的服務。必要時,還需要主動分配資源,把空閑的資源分配給重要的服務。
正確地使用模式,可以用更少的時間開發(fā)出更好的系統(tǒng),而且也使設計者的水平達到一個更高的水平。但要注意:模式受到應用場景的限制,對系統(tǒng)的約束也很多,所以要具體問題具體分析。
只有對問題有著深刻理解的基礎上進行創(chuàng)新,才能有好的設計哦O(∩_∩)O~