對于大部分前端同學(xué)來說,后臺服務(wù)或者整個網(wǎng)站架構(gòu)是個黑盒,前端工程師所看到所接觸的業(yè)務(wù)只是冰山一角。
本文,從一個前端人的視角,以一張大型網(wǎng)站架構(gòu)圖開始,將這個潘多拉的魔盒打開……只是概述性的介紹,提綱式的分析講解。
來自李智慧老師《大型網(wǎng)站技術(shù)架構(gòu)-核心原理與案例分析》第一章的圖示。

1. 接收請求
反向代理服務(wù)器接受請求,根據(jù)具體內(nèi)容路由到不同的服務(wù)器。
- 如果瀏覽器請求的是資源文件,比如HTML文件,JavaScript或樣式表……
- 第三方靜態(tài)資源:路由到CDN(內(nèi)容分發(fā)網(wǎng)絡(luò))服務(wù)器上。因為靜態(tài)資源不經(jīng)常改動(比如,第三方依賴庫,樣式表,字體文件等等),所以很適合存儲在CDN上。
- 普通靜態(tài)資源:由反向代理服務(wù)器直接返回。
- 如果瀏覽器請求動態(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ù)?
舉例,用戶下單流程:
- 用戶下單后,寫入消息隊列,后直接返回客戶端;
- 庫存子系統(tǒng):讀取消息隊列信息,完成減庫存;
- 配送子系統(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ù)庫,主要用于搜索;
如有錯漏之處,望指正。
微信公眾號:
