對于大部分前端同學(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)可由專門的團隊和部門負(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ù)庫题涨,主要用于搜索偎谁;
如有錯漏之處,望指正携栋。
微信公眾號: