關於什麼是模式,這個來自建築師的詞彙是這樣定義的:」每個模式描述了一個在咱們周圍不斷重複發生的問題及該問題解決方案的核心。這樣,你就能一次又一次地使用該方案而沒必要作重複的工做」。html
模式的關鍵在於模式的可重複性,問題與場景的可重複性帶來的解決方案的可重複使用。前端
聯繫實際開發:
每一個作先後臺開發的小夥伴們都會發現一點,一個正兒八經的後臺系統,80%是重複的,20%是特別的(能夠稱做個性化定製)。ios
舉個例子:
人人開源的後臺系統:shell
Jeesite4的後臺系統:數據庫
從這二者進行比對就能夠明顯的發現公共的部分很是類似(只不過展示的形式不同,renren-security中的角色管理是直接在菜單中顯示,而jeesite4則放在權限管理中,只需點擊便可看到對應的角色管理)
在這裏我就不詳細說它們的內部架構了,感興趣的能夠參考個人這篇博客開源項目之架構分享後端
在軟件開發中,可複用模式很是重要,由於這會直接影響到敏捷開發的效率高低。緩存
分層是企業應用系統中最多見的一種架構模式,將系統在橫向維度上切分紅幾個部分,每一個部分負責一部分相對比較單一的職責,而後經過上層對下層的依賴和調用組成一個完整的系統。安全
應用層:負責具體業務和視圖展現,如網站首頁及搜索輸入和結果展現。
服務層:爲應用層提供服務支持,如用戶管理服務,購物車服務等。
數據層:提供數據存儲訪問服務,如數據庫、緩存、文件、搜索引擎等。服務器
這種分層模式,不少開發者們並不陌生,特別是Java開發的朋友們,最經常使用的就是三層架構(業務邏輯層、數據訪問層、UI層等),在分層模式中就是一個比較好的詮釋。網絡
經過分層,能夠更好地將一個龐大的軟件系統切分紅不一樣的部分,便於分工合做開發和維護;各層之間具備必定的獨立性,只要維持調用接口不變,各層能夠根據具體問題獨立演化發展而不須要其餘層必須作出相應的調整。
任何事情有利也有弊,分層並非萬能的,好比禁止跨層次調用(應用層不能直接調用數據層)及逆向調用(數據層調用服務層、或服務層調用應用層等)。
不過總的來講,正是由於有了分層,軟件開發效率纔會愈來愈高,再沒有分層的時代,數據層、業務邏輯層、表現層所有耦合在一塊兒,真的是牽其一而動全身。在此我不得不佩服早期開發人員的勇氣(這裏以早期Java開發爲例,記得在校的時候我曾經見過一個JSP+Servlet囊括數據層、業務邏輯層、表現層內容,當時我看到這個項目就冒冷汗,太TMD的變態了)
若是說分層是將軟件在橫向方面進行切分,那麼分割就是在縱向方面對軟件進行切分。
網站越大,功能越複雜,服務和數據處理的種類也越多,將這些不一樣的功能和服務分割開來,包裝成高內聚低耦合的模塊單元,一方面有助於軟件的開發和維護;另外一方面,便於不一樣模塊的分佈式部署,提升網站的併發處理能力和功能擴展能力。
那麼什麼是內聚?什麼是耦合?
內聚是從功能角度來度量模塊內的聯繫,一個好的內聚模塊應當剛好作一件事。它描述的是模塊內的功能聯繫(好比一個函數只辦一件事)。
耦合是軟件結構中各模塊之間相互鏈接的一種度量,耦合強弱取決於模塊間接口的複雜度、進入或訪問一個模塊的點以及經過接口的數據(耦合這個很好理解,耦合性越低代碼的可擴展性可維護性越好,相反耦合性越高,開發者們就有種想上吊自殺的衝動,耦合性越高的例子就很少說了,特別是維護老項目的開發者們感觸最深了)
對於大型網站,分層和分割的一個主要目的是爲了切分後的模塊便於分佈式部署,即將不一樣模塊部署在不一樣的服務器上,經過遠程調用協同工做。分佈式意味着可使用更多的計算機完成一樣的功能,計算機越多,CPU、內存、存儲資源也就越多,可以處理的併發訪問和數據量就越大,進而可以爲更多的用戶提供服務。
分佈式也就其弊端:
(1)服務的調用必須經過網絡,可能對性能形成比較嚴重的影響;
(2)服務器越多,服務器宕機的機率也就越大,宕機會形成服務不可用,直接致使網站可用性下降;
(3)數據一致性問題;
(4)開發管理維護困難;
經常使用的分佈式方案:
(1)分佈式應用和服務:將分層和分割後的應用和服務模塊分佈式部署,除了能夠改善網站性能和併發性、加快開發和發佈速度、減小數據庫鏈接資源消耗外;還可使不一樣應用複用共同的服務,便於業務功能擴展;
(2)分佈式靜態資源:網站的靜態資源如JS、CSS、圖片等資源獨立分佈式部署,並採用獨立的域名,即人們常說的動靜分離。
(3)分佈式數據和存儲:大型網站處理以P爲單位的海量數據(P這個單位也許有人對此不熟悉,本人普及一下,1024K=1M 1024M=1G 1024G=1T 1024T=1P),一般分佈式存儲以NoSQL居多。
(4)分佈式計算,首推Hadoop。
記得當初我對集羣和分佈式之間的區別不太理解,認爲它們差很少。
其實它們之間的區別大了去了,在此我用一句話歸納(很是理解,保你不忘):
集羣就是不一樣的機器提供相同的服務;
分佈式是不一樣的機器提供不一樣的服務;
服務器集羣有更多的服務器提供相同的服務,所以能夠提供更好的併發特性,當有更多用戶訪問的時候,只須要向集羣中加入新的機器便可。同時由於一個應用由多臺服務器提供,當某臺服務器發生故障時,負載均衡設備或者系統的失效轉移機制會將請求轉發到集羣中的其餘服務器上,使服務器故障不影響用戶使用。因此在網站應用中,即便是訪問量很小的分佈式應用和服務,也至少要部署兩臺服務器構成一個小的集羣,目的就是提升系統的可用性。
緩存就是將數據存放在舉例計算最近的位置以加快處理速度。緩存是改善軟件性能的第一手段,現代CPU愈來愈快的一個重要因素就是使用更多的緩存,在複雜的軟件設計中,緩存幾乎無處不在。
(1)CDN:即內容分發網絡,部署在距離終端用戶最近的網絡服務商,用戶的網站請求老是先到達他的網絡服務商那裏,在這裏緩存網站的一些靜態資源(較少變化的數據),能夠就近以最快速度返回給用戶,如視頻網站和門戶網站會將用戶訪問量大的熱點內容緩存在CDN。
(2)反向代理:反向代理屬於網站前端架構的一部分,部署在網站的前端,當用戶請求到達網站的數據中心時,最早訪問到的就是反向代理服務器,這裏緩存網站的靜態資源,無需將請求繼續轉發給應用服務器就能返回給用戶。
(3)本地緩存:在應用服務器本地緩存着熱點數據,應用程序能夠在本機內存中直接訪問數據,而無需訪問數據庫;
(4)分佈式緩存:大型網站的數據量很是龐大,即便只緩存一小部分,須要的內存空間也不是單機能承受的,因此處了本地緩存,還須要分佈式緩存,將數據緩存在一個專門的分佈式緩存集羣中,應用程序經過網絡通訊訪問緩存數據;
注意:
使用緩存的兩個前提條件:
a.數據訪問熱點不均衡,某些數據會更頻繁的訪問;
b.數據在某個時間段內有效,不會很快過時,不然緩存的數據就會因已經失效而產生髒讀,影響結果的正確性。
什麼是髒讀?
通俗的講,當一個事務正在訪問數據,而且對數據進行了修改,而這種修改尚未提交到數據庫中,這時,另一個事務也訪問這個數據,而後使用了這個數據。由於這個數據是尚未提交的數據,那麼另一個事務讀到的這個數據是髒數據,依據髒數據所作的操做多是不正確的
網站應用中,緩存除了能夠加快數據訪問數據,還能夠減輕後端應用和數據存儲的負載壓力,這一點對網站數據庫架構相當重要,網站數據庫幾乎都是按照有緩存的前提進行負載能力設計的。
計算機軟件發展的一個重要目標和驅動力就是下降軟件耦合性。事物之間直接關係越少,就越少被彼此影響,越能夠獨立發展。
系統解耦合的手段除了前面提到的分層、分割、分佈式等,還有一個重要手段就是異步,業務之間的消息傳遞不是同步調用,而是將一個業務操做分紅多個階段,每一個階段之間經過共享數據的方式異步執行協做。
異步架構是典型的生產者消費者模式,二者不存在直接調用,只要保持數據結構不變,彼此功能實現能夠隨意變換而不互相影響,這對網站擴展新功能很是便利。除此外,使用異步消息隊列還有以下特性:
(1)提升系統可用性。消費者服務器發生故障,數據會在消息隊列服務器中存儲堆積,生產者服務器能夠繼續處理業務請求,系統總體表現無端障。消費者服務器恢復正常後,繼續處理消息隊列中的數據。
(2)加快網站響應速度。處在業務處理前端的生產者服務器在處理完業務請求後,將數據寫入消息隊列,不須要等待消費者服務器處理就能夠返回,響應延遲減小;
(3)消除併發訪問高峯。用戶訪問網站是隨機的,存在訪問高峯和低谷,即便網站按照通常訪問高峯進行規劃和部署,也依然會出現突發事件,好比購物網站的促銷活動,微博上的熱點事件(好比以前趙麗穎官宣致使微博宕機)。
網站須要7x24小時連續運行,可是服務器隨時可能出現故障,特別是服務器規模比較大時,出現某臺服務器宕機是必然事件。要想保證在服務器宕機的狀況網站依然能夠繼續服務,不丟失數據,就須要必定程度的服務器冗餘運行,數據冗餘備份,這樣當某臺服務器宕機時,能夠將其上的服務和數據訪問轉移到其餘機器上。
訪問和負載很小的服務也必須部署至少兩臺服務器構成一個集羣,其目的就是經過冗餘實現服務高可用。數據庫除了按期備份(可經過shell腳本實現),存檔保存外,爲了保證在線業務高可用,還須要對數據進行主從分離,實時同步實現熱備份。
爲了抵禦地震等不可抗因素致使的網站徹底癱瘓,某些大型網站會對整個數據中心進行備份,全球範圍內部署災備數據中心。網站程序和數據實時同步到多個災備數據中心。
自動化,如自動化監控報警(zabbix、nagios等)、自動化部署(jenkins)、自動化測試等。
一般分佈式項目通常自動化程度比較高。
後續我會針對這些寫一個專題實踐。
互聯網的開放特性使得其從誕生起就面對巨大的安全挑戰,網站在安全將方面也積累不少模式,如對於常見的網站XSS攻擊、SQL注入、進行編碼轉換等相應處理、對於垃圾敏感信息進行過濾等。
本文主要參考《大型網站技術架構:核心原理與案例分析》,上述內容做爲本人記錄的讀書筆記。