分佈式基礎(2)-大型網站通用架構模式

本文主要參考自《大型網站技術架構:核心原理與案例分析》一書第二章節和其他網絡文章,如有遺漏或錯誤,還望海涵並指出。謝謝!

在這裏插入圖片描述

好的設計絕對不是模仿,不是生搬硬套某個模式,而是在對問題深刻理解之上的創造與創新,即使是“微創新”,也是讓人耳目一新的似曾相識。山寨與創新的最大區別不在於是否抄襲,是否模仿,而在於對問題和需求是否真正理解和把握。
–《大型網站技術架構:核心原理與案例分析》

一.何謂模式

“每一個模式描述了一個在我們周圍不斷重複發生的問題及該問題解決方案的核心。這樣,你就能一次又一次地使用該方案而不必做重複工作”。

模式的關鍵在於模式的可重複性,問題與場景的可重複性帶來解決方案的可重複使用。

例如23種設計模式就是後端開發領域前人對於如何設計程序的可拓展性、可靠性和易用性的高度總結,許多經典的軟件以及框架都參考和借鑑了這些經典的設計模式,並且在這之上做出了許多的創新。

對於技術的學習也是一樣的,當務之急是知道如何使用技術來解決現實問題(how?),但是更重要的一點在於瞭解技術到底是如何解決問題的、背後的思想是什麼、模式是什麼(why?),然後應用在自身的技術或業務中。要站在巨人的肩膀上創新。

二.通用架構模式

1.分層

分層是計算機領域中一種常見的思想,例如計算機網絡中,通過將不同的技術和規範分爲七層,由下層來服務上層,而上層可以只做好自己的事情就好了,不必理會下層是如何提供的服務,上下層之間只需要約定好接口就夠了,降低了耦合度。

如在Java的Web服務開發過程中,也常常需要將整個項目分爲控制層、業務層、數據交互層等層次,讓它們各種來解決各自的問題即可。這樣能夠起到邏輯清晰,代碼依賴性低的作用

2.分割

分層可以是做將項目進行水平切分,而分割可以視爲將項目進行垂直切分。

分割指的是將項目分割爲不同的業務線和模塊,譬如一個購物網站可以按業務的不同分爲首頁業務、購物車業務、商品管理業務、用戶管理業務等,然後由不同的團隊負責開發。

3.分佈式

隨着應用越來越大,併發的訪問也越來越多,此時單體的應用可能無法承受這麼大的壓力,所以此時出現了分佈式的服務,一臺機器處理不了的請求,可以分發給其他的機器處理。

分佈式系統指的是由多臺不同的主機共同提供資源來組成服務。

常見的分佈式方案有一下幾種:

1.分佈式的應用與服務:將大應用拆分爲多個小應用或服務分開部署

2.分佈式靜態資源:將網站的靜態資源如JS、CSS、圖片和文件等獨立部署

3.分佈式數據與存儲:將數據庫和應用分離,單獨部署

4.分佈式計算:將耗費大量計算資源的服務,例如大數據分析、機器學習訓練集等進行單獨等部署

分佈式系統會出現哪些挑戰或問題?

1.分佈式的主機之間需要通過網絡連接,所以網絡狀況可能會對分佈式系統造成重大影響。根據CAP理論,當網絡分區(Partition)發生時,分佈式主機數據間的一致性(Consistent)和服務的可用性(Avaliable)只能保證一個。要不就是一致性等不到保證、要不就是可用性等不到保證。

2.各種服務和資源分散在不同的機器上,如何保證機器宕機時數據的不丟失以及服務的恢復。

4.集羣

分佈式的系統下,將不同作用的服務拆分到不同的機器上面,而集羣要做的事情和分佈式相似,就是提高可接受的訪問壓力和保證服務的可用性;但是對於集羣來說,集羣中的不同機器提供的是同一服務。

例如Redis的集羣由兩臺服務器組成,每臺服務器提供的服務都是一樣的,客戶端的請求具體會被哪臺服務器處理需要通過負載均衡算法來判斷;當其中一臺機器宕機時,仍有一臺機器可以繼續提供服務。

5.緩存

緩存就是通過將數據放到能夠更快速訪問到的地方以加快訪問速度。

緩存可以分爲以下幾種:

1.CDN:內容分發網絡可以將請求轉發到距離用戶最近的服務器,或者是直接返回已經存在的數據,加快資源的訪問速度

2.反向代理:通常反向代理服務器中緩存有網站的靜態資源(如Nginx),可以加快訪問速度

3.本地緩存:本地緩存即存在於應用程序中或是本地服務器上的緩存數據,可用ehcache技術來實現

4.分佈式緩存:對於大量的請求和大量的緩存數據,更常見的做法是使用分佈式緩存服務,例如Redis集羣等

使用緩存有以下兩個前提:

1.被緩存的數據應該是經常被訪問、但是更改不是很頻繁的熱點數據。

2.被緩存的數據應該具有一定的時效,而不能很快就過期,不然會產生髒讀現象

6.異步處理

大型網站架構中,不僅可以通過分層、分割、分佈式來進行解耦和提高性能,還可以使用異步處理的方式,異步處理主要是通過消息隊列(如Kafka、ActiveMQ)來構建不同系統或機器、應用之間的通信,消息隊列的兩端被稱爲生產者與消費者,其主要的作用如下:

1.提高系統可用性:設想這樣的一個場景,系統正在處理大量的訂單數據,此時服務器突然宕機,那麼訂單數據可能沒被處理完就丟失了,此時如果使用消息隊列來存儲訂單數據,如果系統出現宕機,那麼在重啓機器之後,消息隊列由於擁有持久化機制,所以消息隊列中的數據並不會丟失,而是可以繼續被消費者消費並處理,這就提升了系統的可用性。

2.加快服務響應速度:當生產者接收到數據,並且放入消息隊列時即可返回響應,而不需要等待整個業務的處理完成,而消費者取到消息後纔會進行真正的業務處理。

3.消除併發訪問高峯:有時系統突然出現了高於平常的訪問大於系統處理能力時,可能會發生阻塞或使系統宕機,例如搶購等操作。此時可以將請求放入消息隊列中排隊,由消費者來進行逐一的處理,就不會對應用產生過大對負載。

7.冗餘備份

網站由於需要24小時地運轉,但是請求過大或某些原因可能導致某臺機器宕機,例如MySQL可能出現宕機的情況,那麼就無法對外提供數據服務。

爲了保證某臺機器宕機後,系統仍能對外保持服務,此時的做法是做數據的冗餘與備份,這樣纔可以在機器掛掉之後,迅速地啓動其他機器提供服務。

例如微軟爲了防止地震或自然災害的影響造成系統癱瘓,將數據服務器拆分成上千臺放入深海之中,以便在任何突發情況下,都存在數據的備份。

8.自動化

對於一切應用來說,最理想的情況下是完全自動化的,例如代碼是自動化部署更新的、測試是自動化測試、宕機後的機器切換也是自動化的、自動化的代碼管理、接口出錯可以自動化報警、請求量大可以自動化降級等等,這也是現在運維最新的發展方向。

9.安全

越大的網站越容易遭受黑客的攻擊,例如XSS攻擊、DDos攻擊、CSRF攻擊、SQL注入攻擊等等,所以在特別需要保證安全的場景下,例如登陸、支付等場景需要引入驗證碼校驗、請求籤名校驗等。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章