圖解大型網(wǎng)站架構(gòu)

對于大部分前端同學(xué)來說,后臺服務(wù)或者整個網(wǎng)站架構(gòu)是個黑盒,前端工程師所看到所接觸的業(yè)務(wù)只是冰山一角。

本文,從一個前端人的視角,以一張大型網(wǎng)站架構(gòu)圖開始,將這個潘多拉的魔盒打開……只是概述性的介紹,提綱式的分析講解。

來自李智慧老師《大型網(wǎng)站技術(shù)架構(gòu)-核心原理與案例分析》第一章的圖示。

distributed service.png

1. 接收請求

反向代理服務(wù)器接受請求,根據(jù)具體內(nèi)容路由到不同的服務(wù)器。

  1. 如果瀏覽器請求的是資源文件,比如HTML文件,JavaScript或樣式表……
  • 第三方靜態(tài)資源:路由到CDN(內(nèi)容分發(fā)網(wǎng)絡(luò))服務(wù)器上。因為靜態(tài)資源不經(jīng)常改動(比如,第三方依賴庫,樣式表,字體文件等等),所以很適合存儲在CDN上。
  • 普通靜態(tài)資源:由反向代理服務(wù)器直接返回。
  1. 如果瀏覽器請求動態(tài)資源,比如REST請求,那么路由到“負(fù)載均衡調(diào)度服務(wù)器”,再由后臺應(yīng)用服務(wù)器集群處理。

2. 將業(yè)務(wù)拆分為多個服務(wù),服務(wù)協(xié)作完成請求

傳統(tǒng)方式是后臺只有一個服務(wù),包羅萬象。隨著項目越來越復(fù)雜,以“高內(nèi)聚,低耦合”的思想,將業(yè)務(wù)拆分為獨立模塊,分別部署。這就是圖中的“B應(yīng)用服務(wù)器1”,“A應(yīng)用服務(wù)器1”……

那么,如何拆分業(yè)務(wù)?

  • 根據(jù)業(yè)務(wù)屬性進(jìn)行垂直切分,比如:產(chǎn)品子系統(tǒng),購物子系統(tǒng),支付子系統(tǒng),評論子系統(tǒng),客服子系統(tǒng),接口子系統(tǒng)(對接如進(jìn)銷存,短信等外部系統(tǒng))。
  • 根據(jù)業(yè)務(wù)子系統(tǒng)進(jìn)行等級定義,分為核心系統(tǒng)和非核心系統(tǒng)。比如:核心系統(tǒng):產(chǎn)品子系統(tǒng),購物子系統(tǒng),支付子系統(tǒng);非核心:評論子系統(tǒng),客服子系統(tǒng),接口子系統(tǒng)。

業(yè)務(wù)經(jīng)過拆分,每個子系統(tǒng)可由專門的團(tuán)隊和部門負(fù)責(zé),解決模塊之間耦合以及擴展性問題;每個子系統(tǒng)單獨部署,避免集中部署導(dǎo)致一個應(yīng)用掛了,全部應(yīng)用不可用的問題。

下一步,如何組織子業(yè)務(wù)完成某一具體任務(wù)?

舉例,用戶下單流程:

  1. 用戶下單后,寫入消息隊列,后直接返回客戶端;
  2. 庫存子系統(tǒng):讀取消息隊列信息,完成減庫存;
  3. 配送子系統(tǒng):讀取消息隊列信息,進(jìn)行配送;

這個過程,利用“消息隊列服務(wù)器”異步調(diào)度所需的服務(wù),協(xié)同完成業(yè)務(wù)。

3. 部署分布式服務(wù)

為了提高高并發(fā)處理能力,可將請求分發(fā)到應(yīng)用服務(wù)器集群中的任何一臺服務(wù)器上。也就是說,將同樣的服務(wù)部署到N臺服務(wù)器上,讓他們一起處理用戶請求,這樣最大程度上減少每個服務(wù)的壓力。

可用到的負(fù)載均衡算法:

  • 輪詢:所有請求被依次發(fā)到每臺應(yīng)用服務(wù)器上;
  • 加權(quán)輪詢:在輪詢基礎(chǔ)上,按照配置的權(quán)重將請求分發(fā)到每個服務(wù)器;
  • 隨機:請求被隨機分發(fā)到應(yīng)用服務(wù)器上;
  • 最少連接:記錄每個應(yīng)用服務(wù)器正在處理的連接數(shù),將請求分發(fā)到最少連接的服務(wù)器上;
  • 源地址散列:根據(jù)請求來源的IP進(jìn)行Hash計算,對應(yīng)到某臺應(yīng)用服務(wù)器,這樣,來自同一個IP的請求總會被同一臺應(yīng)用服務(wù)器處理;

4. 利用緩存

緩存分為本地緩存和遠(yuǎn)程緩存。

  • 本地緩存和應(yīng)用服務(wù)共享內(nèi)存,所以,它的數(shù)量不應(yīng)該太多,適合存儲讀取最頻繁且不易變動的數(shù)據(jù)。
  • 遠(yuǎn)程緩存部署在專門的服務(wù)器上,可以使一臺也可以是多臺。如是多臺集群,則稱為分布式緩存服務(wù)器,優(yōu)點是存儲量大,缺點是讀取比本地緩存慢。

分布式緩存服務(wù)器是將緩存數(shù)據(jù)分在N臺服務(wù)器上存儲,利用服務(wù)器數(shù)量的遞增而擴大存儲容量。

為什么需要分布式緩存?

利用分布式緩存,可以實現(xiàn)單點登錄。比如,登錄www.site1.a.com之后,希望再訪問www.site2.a.com,www.site3.a.com時,無需再次登錄。這時,就不應(yīng)該將與登錄相關(guān)的session信息存放在本地服務(wù)器緩存中(因為各個服務(wù)器的session信息不共享),而應(yīng)該將session存放于分布式緩存,并提供統(tǒng)一訪問模塊-session服務(wù)器。session服務(wù)器用于為其他所有應(yīng)用服務(wù)提供session讀寫功能。

5. 處理數(shù)據(jù)

處理數(shù)據(jù)就必須訪問存儲數(shù)據(jù)的容器,此容器不僅僅包括常見的關(guān)系數(shù)據(jù)庫,比如MySQL,SQL Server,還包括非關(guān)系數(shù)據(jù)庫,比如NoSQL,等等。

參考圖示和“統(tǒng)一數(shù)據(jù)訪問模塊”交互的數(shù)據(jù)服務(wù)器:

  • 分布式緩存服務(wù)器:緩存服務(wù)器集群;
  • 分布式文件服務(wù)器:多臺服務(wù)器存儲文件,可線性擴充;
  • 分布式數(shù)據(jù)庫服務(wù):只有單表規(guī)模非常龐大的時候才使用,將大量數(shù)據(jù)分庫分表存儲;并將不同業(yè)務(wù)的數(shù)據(jù)部署在不同的物理服務(wù)器上。
    另外,為了進(jìn)一步減輕數(shù)據(jù)庫負(fù)載壓力,可以采用“讀寫分離”模式:配置多臺數(shù)據(jù)庫,一臺master,只用于寫數(shù)據(jù);多臺slave,只用于讀數(shù)據(jù)。主數(shù)據(jù)庫master的數(shù)據(jù)實時同步到slave數(shù)據(jù)庫上。
  • NoSQL服務(wù)器:非關(guān)系數(shù)據(jù)庫,如HBase,單表可以存儲海量數(shù)據(jù),可線性擴充;
  • 搜索引擎服務(wù)器:也是一種非關(guān)系數(shù)據(jù)庫,主要用于搜索;

如有錯漏之處,望指正。

微信公眾號:

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容