整個(gè)網(wǎng)站架構(gòu)一般可以分為應(yīng)用層、服務(wù)層、數(shù)據(jù)層。實(shí)踐中大的分層結(jié)構(gòu)還可以繼續(xù)分層,比如應(yīng)用層還可以繼續(xù)分為視圖層和業(yè)務(wù)邏輯層,服務(wù)層也可以繼續(xù)細(xì)分為數(shù)據(jù)接口層、邏輯處理層等。通過(guò)分層,把一個(gè)龐大的系統(tǒng)切分為不同的部分,便于分工開(kāi)發(fā)和維護(hù);各層之間相互有一定的獨(dú)立性,在網(wǎng)站的開(kāi)發(fā)中可以根據(jù)不同的需求進(jìn)行相應(yīng)的調(diào)整。邏輯上分層之后,在物理部署上也可以根據(jù)需求制定不同的策略。
整個(gè)
網(wǎng)站架構(gòu)一般可以分為應(yīng)用層、服務(wù)層、數(shù)據(jù)層。實(shí)踐中大的分層結(jié)構(gòu)還可以繼續(xù)分層,比如應(yīng)用層還可以繼續(xù)分為視圖層和業(yè)務(wù)邏輯層,服務(wù)層也可以繼續(xù)細(xì)分為數(shù)據(jù)接口層、邏輯處理層等。通過(guò)分層,把一個(gè)龐大的系統(tǒng)切分為不同的部分,便于分工開(kāi)發(fā)和維護(hù);各層之間相互有一定的獨(dú)立性,在網(wǎng)站的開(kāi)發(fā)中可以根據(jù)不同的需求進(jìn)行相應(yīng)的調(diào)整。邏輯上分層之后,在物理部署上也可以根據(jù)需求制定不同的策略。
分層架構(gòu)不僅僅是為了規(guī)劃軟件的邏輯結(jié)構(gòu),其對(duì)網(wǎng)站的高并發(fā)分布式架構(gòu)來(lái)說(shuō)尤為重要。進(jìn)行分層以后,可以從縱向進(jìn)行業(yè)務(wù)分割,根據(jù)不同的業(yè)務(wù)模塊一個(gè)項(xiàng)目劃分成不同的模塊交給單獨(dú)的團(tuán)隊(duì)去開(kāi)發(fā)部署,完成后分別部署在不同的
服務(wù)器上,通過(guò)鏈接進(jìn)行互聯(lián)。再根據(jù)不同情況來(lái)對(duì)不同的節(jié)點(diǎn)進(jìn)行冗余來(lái)保證網(wǎng)站的高可用性,接下來(lái)進(jìn)行緩存、CDN、反向代理等等的優(yōu)化。
對(duì)于一個(gè)高訪問(wèn)量、大數(shù)據(jù)量的網(wǎng)站我們需要考慮什么呢?
1.1 性能
首先就是性能了,性能是一個(gè)網(wǎng)站的的重要指標(biāo),除非是沒(méi)得選擇,就這一個(gè)網(wǎng)站,不然用戶是絕對(duì)不會(huì)忍受一個(gè)超級(jí)慢的網(wǎng)站。正因?yàn)樾阅軉?wèn)題無(wú)處不在,解決性能問(wèn)題的方式也各種各樣,從用戶請(qǐng)求一個(gè) url 開(kāi)始,進(jìn)行的每一個(gè)環(huán)節(jié)都可以進(jìn)行優(yōu)化;根據(jù)上面的分層,可以大致從三個(gè)方面進(jìn)行優(yōu)化,應(yīng)用層優(yōu)化,服務(wù)層優(yōu)化,數(shù)據(jù)層優(yōu)化。
涉及到的知識(shí)就是 web 前端的優(yōu)化,應(yīng)用服務(wù)器端的優(yōu)化和數(shù)據(jù)的存儲(chǔ),索引,緩存等,這些在后面的內(nèi)容里會(huì)分別展開(kāi)細(xì)說(shuō),但性能只是一個(gè)網(wǎng)站的必要條件,除此之外,因?yàn)闊o(wú)法預(yù)知網(wǎng)站可能會(huì)面臨的壓力或是攻擊,還要保證網(wǎng)站在各種情境下(高并發(fā),高負(fù)載,持續(xù)壓力不均勻等)保持穩(wěn)定的性能。包括以下各個(gè)方面:性能測(cè)試指標(biāo)、性能測(cè)試方法、性能優(yōu)化策略。
性能測(cè)試指標(biāo)
主要的性能測(cè)試指標(biāo)有響應(yīng)時(shí)間、并發(fā)數(shù)、吞吐量、性能計(jì)數(shù)器等。
響應(yīng)時(shí)間
指的是從發(fā)出這個(gè)請(qǐng)求開(kāi)始到接收到數(shù)據(jù)的時(shí)間,一般情況下這個(gè)時(shí)間都非常非常的小甚至小于測(cè)試的誤差值,所以我們可以采用重復(fù)請(qǐng)求的方式來(lái)獲取具體的響應(yīng)時(shí)間,比如請(qǐng)求十萬(wàn)次,記錄總時(shí)間,然后計(jì)算出單次請(qǐng)求的時(shí)間
并發(fā)數(shù)
指能夠同時(shí)處理的請(qǐng)求數(shù)目,對(duì)于網(wǎng)站而言,即并發(fā)用戶數(shù)
吞吐量
是單位時(shí)間能能夠處理的請(qǐng)求數(shù),體現(xiàn)的系統(tǒng)的整體處理能力> 衡量指標(biāo)有很多,可以是 請(qǐng)求數(shù)/秒 頁(yè)面數(shù)/秒 訪問(wèn)人數(shù)/天 處理業(yè)務(wù)數(shù)/小時(shí) 等> 常用的量化指標(biāo)有 TPS(每秒事務(wù)數(shù)) HPS(每秒 HTTP 請(qǐng)求數(shù)) QPS(每秒查詢數(shù))等
性能計(jì)數(shù)器
描述服務(wù)器或操作系統(tǒng)的一些性能指標(biāo),包括系統(tǒng)負(fù)載(System Load),線程數(shù),內(nèi)存使用,磁盤(pán)和網(wǎng)絡(luò) I/O 等,當(dāng)這些值超過(guò)警告值(安全臨界值)時(shí),就會(huì)向開(kāi)發(fā)人員報(bào)警,及時(shí)處理異常。
性能測(cè)試方法
性能測(cè)試是一個(gè)統(tǒng)稱,具體可以分為性能測(cè)試、負(fù)載測(cè)試、壓力測(cè)試、穩(wěn)定性測(cè)試。性能測(cè)試以初期設(shè)計(jì)的指標(biāo)為預(yù)期目標(biāo),不斷對(duì)系統(tǒng)施壓,看系統(tǒng)在預(yù)期的范圍內(nèi),能否達(dá)到預(yù)期的性能。負(fù)載測(cè)試對(duì)系統(tǒng)不斷增加并發(fā)請(qǐng)求以增加系統(tǒng)壓力,直到系統(tǒng)某項(xiàng)或多項(xiàng)指標(biāo)達(dá)到安全臨界值,這時(shí)繼續(xù)對(duì)系統(tǒng)施加壓力,系統(tǒng)的處理能力會(huì)有所下降。壓力測(cè)試是在超過(guò)安全負(fù)載的情況下,繼續(xù)施壓,直到系統(tǒng)崩潰或不再能夠處理任何請(qǐng)求,以此來(lái)計(jì)算系統(tǒng)的最大壓力承受能力。
穩(wěn)定性測(cè)試在一定的壓力(不均勻施壓)下,系統(tǒng)能夠穩(wěn)定的運(yùn)行較長(zhǎng)時(shí)間。
性能優(yōu)化策略
要定位問(wèn)題產(chǎn)生原因,排查不同環(huán)節(jié)的日志,分析哪個(gè)環(huán)節(jié)的響應(yīng)時(shí)間與預(yù)期不相符,然后分析影響性能的原因,是代碼問(wèn)題還是架構(gòu)設(shè)計(jì)不合理,或者系統(tǒng)資源不足,然后根據(jù)實(shí)際問(wèn)題進(jìn)行解決。
1.2 可用性
對(duì)于大型網(wǎng)站而言,出現(xiàn)宕機(jī)的情況是可怕的,因?yàn)榭赡苡猩锨f(wàn)的用戶量,短短幾分鐘的宕機(jī)都有可能導(dǎo)致網(wǎng)站聲譽(yù)掃地,如果是
電商類(lèi)的網(wǎng)站,更可能會(huì)導(dǎo)致用戶的財(cái)產(chǎn)損失,甚至?xí)偵瞎偎?,那時(shí)候損失的就不僅是金錢(qián)和用戶了,因此要保證能夠提供每天 24 小時(shí)的可用,但實(shí)際中服務(wù)器并不能保證每天 24 小時(shí)都能平穩(wěn)的運(yùn)行,可能出現(xiàn)硬件問(wèn)題,也可能出現(xiàn)軟件問(wèn)題,總之問(wèn)題總是會(huì)有的。
所以我們高可用設(shè)計(jì)的目標(biāo)就是在某些服務(wù)器宕機(jī)的情況下,也能夠保證服務(wù)或應(yīng)用正常運(yùn)行,網(wǎng)站高可用的主要手段是冗余,應(yīng)用部署在多臺(tái)服務(wù)器上同時(shí)提供訪問(wèn),數(shù)據(jù)存儲(chǔ)在多臺(tái)數(shù)據(jù)服務(wù)器之間互相進(jìn)行熱備份,這樣任何一臺(tái)服務(wù)器宕機(jī)都不會(huì)影響服務(wù)或應(yīng)用的整體,也不會(huì)產(chǎn)生數(shù)據(jù)丟失。
對(duì)于應(yīng)用服務(wù)器而言,多臺(tái)應(yīng)用服務(wù)器通過(guò)一個(gè)
負(fù)載均衡設(shè)備組成一個(gè)集群同時(shí)對(duì)外提供服務(wù),當(dāng)一臺(tái)服務(wù)器宕機(jī)后,服務(wù)切換到其他服務(wù)器上繼續(xù)執(zhí)行,這樣就可以保證了網(wǎng)站的高可用性,前提是應(yīng)用服務(wù)器不允許存儲(chǔ)用戶會(huì)話信息,否則將會(huì)丟失,這樣即使用戶請(qǐng)求轉(zhuǎn)接到其他服務(wù)器上面也無(wú)法繼續(xù)執(zhí)行。
對(duì)于數(shù)據(jù)存儲(chǔ)服務(wù)器,要提供服務(wù)器之間的實(shí)時(shí)備份,這樣當(dāng)一臺(tái)服務(wù)器宕機(jī)的時(shí)候,將數(shù)據(jù)訪問(wèn)切換到其他服務(wù)器上,并進(jìn)行數(shù)據(jù)恢復(fù)和備份,衡量一個(gè)
系統(tǒng)架構(gòu)設(shè)計(jì)是否滿足高可用的目標(biāo),就是假設(shè)其中一臺(tái)或多臺(tái)服務(wù)器宕機(jī)以及出現(xiàn)各種不可預(yù)期的問(wèn)題時(shí),系統(tǒng)整體是否依然可用。
1.3 伸縮性
面對(duì)著大量用戶的高并發(fā)訪問(wèn)和海量的數(shù)據(jù)存儲(chǔ),不可能只用一臺(tái)服務(wù)器就能夠滿足全部需求,存儲(chǔ)全部數(shù)據(jù)。通過(guò)集群 的方式將多臺(tái)服務(wù)器組成一個(gè)整體共同提供服務(wù),所謂伸縮性就是指通過(guò)不斷向集群中加入服務(wù)器的手段來(lái)應(yīng)對(duì)不斷上升的用戶并發(fā)訪問(wèn)壓力和不斷增長(zhǎng)的數(shù)據(jù)存儲(chǔ)需求,對(duì)于應(yīng)用服務(wù)器集群,只要服務(wù)器上不存儲(chǔ)數(shù)據(jù),所有的服務(wù)器都是對(duì)等的,通過(guò)使用合適的負(fù)載均衡設(shè)備就可以向集群中不斷加入新的服務(wù)器。
對(duì)于緩存服務(wù)器而言,加入新的服務(wù)器可能會(huì)導(dǎo)致緩存路由失效,從而導(dǎo)致大部分的緩存數(shù)據(jù)都無(wú)法訪問(wèn),需要改進(jìn)緩存路由算法來(lái)保證緩存數(shù)據(jù)可訪問(wèn),關(guān)系數(shù)據(jù)庫(kù)雖然支持?jǐn)?shù)據(jù)復(fù)制,主從熱備份等機(jī)制,但是很難實(shí)現(xiàn)大規(guī)模集群的可伸縮性。
1.4 可擴(kuò)展性
網(wǎng)站的擴(kuò)展性直接關(guān)系到網(wǎng)站功能模塊的開(kāi)發(fā),網(wǎng)站快速發(fā)展,功能也不斷的增加,網(wǎng)站架構(gòu)的可擴(kuò)展性的主要目的是使其能夠快速的應(yīng)對(duì)需求變化,是為了能夠在增加新業(yè)務(wù)時(shí),盡量實(shí)現(xiàn)對(duì)現(xiàn)有產(chǎn)品無(wú)影響,不需要改動(dòng)或是改動(dòng)很少現(xiàn)有業(yè)務(wù)就能夠上線新產(chǎn)品;不同的產(chǎn)品業(yè)務(wù)之間的耦合度很小,一個(gè)產(chǎn)品或業(yè)務(wù)的改動(dòng)不會(huì)對(duì)其他造成影響。
1.5 安全性
最后就是安全性了。互聯(lián)網(wǎng)是一個(gè)開(kāi)放的平臺(tái),任何人在任何地方都可以訪問(wèn)網(wǎng)站。安全架構(gòu)就是保護(hù)網(wǎng)站不受惡意的訪問(wèn)和攻擊,保護(hù)數(shù)據(jù)不被竊取。