關於什麼是架構,一種比較通俗的說法是「最高層次的規劃,難以改變的決定」,這些規劃和決定奠基了事物將來發展的方向和最終的藍圖。mysql
具體到軟件架構,維基百科是這樣定義的:「有關軟件總體結構與組件的抽象描述,用於指導大型軟件系統各個方面的設計」。通常來講,除了系統的功能需求外,軟件架構還須要關注 性能、可用性、伸縮性、擴展性和安全性這5個架構要素。算法
1. 性能
性能是網站的一個重要指標,除非是沒得選擇,不然用戶沒法忍受一個響應緩慢的網站。一個打開緩慢的網站會致使嚴重的用戶流失,不少時候網站性能是網站架構升級優化的觸發器。sql
優化網站性能的手段很是多,從用戶瀏覽器到後臺數據庫,影響用戶請求的全部環節均可以進行性能優化。數據庫
- 瀏覽器端,能夠經過瀏覽器緩存、使用頁面壓縮、合理佈局頁面、減小Cookie傳輸等手段改善性能。
- 使用 CDN 和 反向代理服務器(前一篇文章中有介紹)
- 在應用服務器端,使用服務器本地緩存和分佈式緩存
- 異步操做,將用戶請求發送至消息隊列等待後續任務處理
- 在高併發狀況下,將多臺應用服務器組成一個集羣共同對外服務,提升總體處理能力,改善性能
- 代碼層面,能夠經過使用多線程、改善內存管理等手段優化性能
- 數據庫服務器端,索引、緩存、SQL優化等性能優化手段都已經比較成熟;而NoSQL數據庫經過優化數據模型、存儲結構、伸縮性等手段在性能方面的優點也日趨明顯。
衡量網站性能有一系列指標:響應時間、TPS、系統性能計數器等,經過監控這些指標能夠分析系統瓶頸,預測網站容量,並對異常指標進行報警,保障系統可用性。對於網站而言,性能符合預期僅僅是必要條件,由於沒法預知網站可能會面臨的訪問壓力,因此必需要考察系統在高併發訪問狀況下,超出負載設計能力的狀況下可能會出現的性能問題。網站須要長時間持續運行,還必須保證系統在持續運行且訪問壓力不均勻的狀況下保持穩定的性能特性。
2. 可用性
大型網站幾乎都承諾7x24小時可用,但事實上任何網站都不可能達到徹底的7x24可用,總會有一些故障時間,扣除這些故障時間就是網站的總可用時間,這個時間換算成網站的可用性指標,以此衡量網站的可用性。一些知名的大型網站能夠作到99.99%以上的可用性。
大型網站一般會有上萬臺服務器,天天一定會有一些服務器宕機,所以網站高可用架構設計的前提是必然會出現服務器宕機,而高可用設計的目標就是當服務器宕機的時候,服務或者應用依然可用。
網站高可用的主要手段是冗餘,應用部署在多臺服務器上同時提供訪問,數據存儲在多臺服務器上互相備份,任何一臺服務器宕機都不會影響應用的總體可用,也不會致使數據丟失。
對於應用服務器而言,多臺服務器用負載均衡設備組成一個集羣共同對外提供服務,任何一臺服務器宕機,只需把請求切換到其餘服務器就可實現應用的高可用,可是一個前提條件是:
應用服務器上不能保存請求的會話信息,不然服務器宕機,會話丟失,即便將用戶請求轉發到其餘服務器上也沒法完成業務處理。
對於存儲服務器,因爲其上存儲着數據,須要對數據進行實時備份,當服務器宕機時,須要將數據訪問轉移到可用的服務器上,並進行數據恢復以保證繼續有服務器宕機的時候數據依然可用。
除了運行環境,網站的高可用還須要軟件開發過程的質量保證。經過預發佈驗證、自動化測試、自動化發佈、灰度發佈等手段,減小將故障引入線上環境的可能,避免故障範圍擴大。
衡量一個系統架構設計是否知足高可用的目標,就是假設系統中任何一臺或者多臺服務器宕機時,以及出現各類不可預期的問題時,系統總體是否依然可用。
確保無單點故障。
3. 伸縮性
所謂伸縮性,是指經過不斷向集羣中加入服務器的手段來緩解不斷上升的用戶併發訪問壓力和不斷增加的數據存儲需求。
衡量架構伸縮性的主要標準就是:是否能夠用多臺服務器構建集羣,是否容易向集羣中添加新的服務器。加入新的服務器後是否能夠提供和原來的服務器無差異的服務。集羣中可容納的總的服務器數量是否有限制。
對於應用服務器集羣,
只要服務器上不保存數據,全部服務器都是
對等的,經過使用合適的負載均衡設備就能夠向集羣中不斷加入服務器。
對於緩存服務器集羣,加入新的服務器可能會致使緩存路由失效,進而致使集羣中大部分緩存數據都沒法訪問。雖然緩存的數據能夠經過數據庫從新加載,可是若是應用已經嚴重依賴緩存,可能會致使整個網站崩潰。
須要改進緩存路由算法保證緩存數據的可訪問性。一致性hash算法。
關係型數據庫雖然支持數據複製,主從熱備等機制,可是很難作到大規模集羣的可伸縮性,所以關係型數據庫的集羣伸縮性方案必須在數據庫以外實現,經過路由分區等手段將部署有多個數據庫的服務器組成一個集羣。
至於大部分 NoSQL 數據庫產品,因爲其先天就是爲海量數據而生,所以其對伸縮性的支持一般都很是好,能夠作到在較少運維參與的狀況下實現集羣規模的線性伸縮。
4. 擴展性
不一樣於上面幾個架構要素,網站的擴展性架構直接關注網站的功能需求。衡量網站架構擴展性好壞的主要標準就是在網站增長新的業務產品時,是否能夠實現對現有產品透明無影響,不須要任何改動或者不多改動既有業務功能就能夠上限新產品。
網站可擴展架構的主要手段是
事件驅動架構 和
分佈式服務。
事件驅動架構在網站一般利用
消息隊列實現,將用戶請求和其餘業務事件構形成消息發佈到消息隊列,消息的處理者做爲消費者從消息隊列中獲取消息進行處理。經過這種方式將消息產生和消息處理分離開來,能夠透明地增長新的消息生產者任務或者新的消息消費者任務。
分佈式服務則是
將業務和可複用服務分離開來,經過分佈式服務框架調用。新增產品能夠經過調用可複用的服務實現自身的業務邏輯,而對現有產品沒有任何影響。可複用服務升級變動的時候,也能夠經過提供多版本服務對應用實現透明升級,不須要強制應用同步變動。
5.安全性
網站的安全架構就是保護網站不受惡意訪問和攻擊,保護網站的重要數據不被竊取。
衡量網站安全架構的標準就是針對現存和潛在的各類攻擊手段與竊密手段,是否有可靠的應對策略。