首頁技術(shù)文章正文

常見web架構(gòu)設(shè)計(jì)

更新時(shí)間:2018-07-24 來源:黑馬程序員 瀏覽量:

   先來說說模式:
   每一個(gè)模式描述了一個(gè)在我們周圍不斷重復(fù)發(fā)生的問題及該問題解決方案的核心。這樣,你就能一次又一次地用該方案而不必做重復(fù)工作。
    先來說說常見的網(wǎng)站架構(gòu)模式。這里沒有涉及具體實(shí)現(xiàn)過程,只是簡單介紹其思想和原理,方便日后有用到再深入了解。
分層
分層是企業(yè)應(yīng)用系統(tǒng)中最常見的一種架構(gòu)模式,將系統(tǒng)在橫向維度上切分成幾個(gè)部分,每個(gè)部分負(fù)責(zé)一部分相對(duì)比較單一的職責(zé),然后通過上層對(duì)下層的依賴和調(diào)用組成一個(gè)完整的系統(tǒng)。



          分層                                 功能
        應(yīng)用層  
負(fù)責(zé)具體業(yè)務(wù)和視圖展示,如網(wǎng)站首頁以及搜索輸入和結(jié)果展示
        服務(wù)層  為應(yīng)用層提供服務(wù)支持,如用戶管理服務(wù),購物車服務(wù)
        數(shù)據(jù)層 提供數(shù)據(jù)存儲(chǔ)訪問服務(wù),如數(shù)據(jù)庫、緩存、文件、搜索引擎等

    分層架構(gòu)還可以細(xì)分下去,比如說應(yīng)用層可以細(xì)分為視圖層和業(yè)務(wù)邏輯層。服務(wù)層可以細(xì)分為數(shù)據(jù)接口層和邏輯處理層。
    分層結(jié)構(gòu)對(duì)網(wǎng)站支持高并發(fā)向分布式發(fā)展至關(guān)重要,所以在網(wǎng)站規(guī)模很小的時(shí)候就應(yīng)該采用分層的架構(gòu),這樣將來網(wǎng)站做大時(shí)才能有更好地應(yīng)對(duì)。
   所以說我們?cè)谠O(shè)計(jì)一個(gè)新項(xiàng)目的架構(gòu)時(shí),就需要考慮到分層。不能等到日后項(xiàng)目做大了,再重構(gòu)就耗時(shí)耗力了。
分割
   上面的分層是將軟件在橫向方面進(jìn)行切分,而分割是在縱向方面對(duì)軟件進(jìn)行切分。將不同的功能和服務(wù)分割開來,包裝成高內(nèi)聚低耦合的模塊單元。
   比如在應(yīng)用層,將購物、論壇、搜索、廣告分割成不同的應(yīng)用,由獨(dú)立的團(tuán)隊(duì)負(fù)責(zé),部署在不同的服務(wù)器上;
在同一個(gè)應(yīng)用內(nèi)部,如果規(guī)模龐大業(yè)務(wù)負(fù)責(zé),會(huì)繼續(xù)進(jìn)行分割,比如說購物業(yè)務(wù),可以分割為機(jī)票酒店業(yè)務(wù)、3C業(yè)務(wù)、小商品業(yè)務(wù)等更細(xì)小的粒度。

分布式

   對(duì)于大型網(wǎng)站,分層和分割的主要目的是為了切分后的模塊便于分布式部署。
   利用分布式解決網(wǎng)站高并發(fā)的問題的同時(shí),會(huì)帶來其他問題:
   分布式意味著服務(wù)調(diào)用必須通過網(wǎng)絡(luò),這可能對(duì)性能造成比較嚴(yán)重的影響;
o        服務(wù)器越多,服務(wù)器宕機(jī)的概率就越大;
o        數(shù)據(jù)的一致性問題,分布式事務(wù)難以保證;
o        開發(fā)管理維護(hù)困難。
   所以說要量力而行,不要為了分布式而分布式。
   常用的分布式方案有以下幾種:
o        分布式應(yīng)用和服務(wù):將分層和分割后的應(yīng)用和服務(wù)模塊分布式部署,使不同應(yīng)用復(fù)用共同的服務(wù),便于業(yè)務(wù)功能擴(kuò)展。
o        分布式靜態(tài)資源:網(wǎng)站的靜態(tài)資源如js、css、圖片等獨(dú)立分布式部署,并采用獨(dú)立的域名。減輕應(yīng)用服務(wù)器的負(fù)載壓力,并通過獨(dú)立    域名加快瀏覽器并發(fā)加載速度。
o        分布式數(shù)據(jù)和存儲(chǔ):數(shù)據(jù)量過大,一臺(tái)機(jī)器無法存儲(chǔ)。
o        分布式計(jì)算:后臺(tái)業(yè)務(wù)需要處理,包括搜索引擎的索引構(gòu)建、數(shù)據(jù)倉庫的數(shù)據(jù)分析統(tǒng)計(jì)。通過Hadoop及MapReduce分布式計(jì)算框架  進(jìn)行批處理計(jì)算

集群

   使用分布式已經(jīng)將切分后的模塊獨(dú)立部署,但是對(duì)于用戶訪問集中的模塊,還需要將獨(dú)立部署的服務(wù)器集群化,多臺(tái)服務(wù)器部署相同應(yīng)用構(gòu) 成一個(gè)集群,通過負(fù)載均衡設(shè)備共同對(duì)外提供服務(wù)。
   即使是訪問量很小的分布式應(yīng)用和服務(wù),也會(huì)部署兩臺(tái)服務(wù)器構(gòu)成一個(gè)小的集群,目的就是提高系統(tǒng)的可用性。

緩存

    緩存是改善軟件性能的第一手段。有以下幾種方式:
o        CDN:內(nèi)容分發(fā)網(wǎng)絡(luò),部署在距離終端用戶最近的網(wǎng)絡(luò)服務(wù)商,在這里緩存網(wǎng)站的一些靜態(tài)資源,就可以以最快的速度返回給用戶。
o        反向代理:反向代理屬于網(wǎng)站前端架構(gòu)的一部分,部署在網(wǎng)站的前端,當(dāng)用戶請(qǐng)求到達(dá)網(wǎng)站的數(shù)據(jù)中心時(shí),最先訪問反向代理服務(wù)器,這里緩存網(wǎng)站的靜態(tài)資源。
o        本地緩存:在應(yīng)用服務(wù)器本地緩存著熱點(diǎn)數(shù)據(jù),應(yīng)用程序可以在本機(jī)內(nèi)存中直接訪問數(shù)據(jù),而無需訪問數(shù)據(jù)庫。
o        分布式緩存:數(shù)據(jù)量很大時(shí),除了本地緩存,還需要分布式緩存,將數(shù)據(jù)緩存在一個(gè)專門的分布式緩存集群中,應(yīng)用程序通過網(wǎng)絡(luò)通

信訪問緩存數(shù)據(jù)
    緩存有兩個(gè)前提條件,
    一是數(shù)據(jù)訪問熱點(diǎn)不均衡,某些數(shù)據(jù)會(huì)被更頻繁的訪問,這些數(shù)據(jù)應(yīng)該放在緩存中;
    二是數(shù)據(jù)在某個(gè)數(shù)據(jù)段內(nèi)有效,不會(huì)很快過期,否則緩存的數(shù)據(jù)就會(huì)因?yàn)橐呀?jīng)失效而產(chǎn)生臟讀,影響結(jié)果的正確性。

異步

   系統(tǒng)解除耦合的重要手段是異步,業(yè)務(wù)之間的消息傳遞不是同步調(diào)用,而是將一個(gè)業(yè)務(wù)操作分成多個(gè)階段,每個(gè)階段之間通過共享數(shù)據(jù)的方式異步執(zhí)行進(jìn)行協(xié)作。
   在單一服務(wù)器內(nèi)部可以通過多線程共享內(nèi)存隊(duì)列的方式實(shí)現(xiàn)異步,處在業(yè)務(wù)操作前面的線程將輸出寫入到隊(duì)列,后面的線程從隊(duì)列中讀取數(shù)據(jù)進(jìn)行處理;
   在分布式系統(tǒng)中,多個(gè)服務(wù)器集群通過分布式消息隊(duì)列實(shí)現(xiàn)異步,分布式消息隊(duì)列可以看作內(nèi)存隊(duì)列的分布式部署。

冗余

   要保證在服務(wù)器宕機(jī)的情況下網(wǎng)站依然可以繼續(xù)服務(wù),不丟失數(shù)據(jù),就需要一定程度的服務(wù)器冗余運(yùn)行,數(shù)據(jù)冗余備份。
   數(shù)據(jù)庫除了定期備份,存檔保存,實(shí)現(xiàn)冷備份外,還需要進(jìn)行主從分離,實(shí)時(shí)同步實(shí)現(xiàn)熱備份。

自動(dòng)化

   發(fā)布對(duì)網(wǎng)站是頭等大事,發(fā)布過程自動(dòng)化可以有效減少故障。自動(dòng)化測(cè)試,自動(dòng)化安全監(jiān)測(cè),自動(dòng)化部署。自動(dòng)化監(jiān)控,自動(dòng)化報(bào)警,自動(dòng)化失效轉(zhuǎn)移,自動(dòng)化失效恢復(fù)。


作者:黑馬程序員人工智能+Python培訓(xùn)學(xué)院

首發(fā):http://python.itheima.com/

分享到:
在線咨詢 我要報(bào)名
和我們?cè)诰€交談!