鄭逸凡
(福州外語(yǔ)外貿(mào)學(xué)院福建福州350202)
大型網(wǎng)站的架構(gòu)模式研究
鄭逸凡
(福州外語(yǔ)外貿(mào)學(xué)院福建福州350202)
隨著網(wǎng)站規(guī)模的不斷擴(kuò)大,用戶的訪問(wèn)量逐漸增加,簡(jiǎn)單的LAMP架構(gòu)無(wú)法支撐大型網(wǎng)站快速發(fā)展的業(yè)務(wù)需求。為了解決大型網(wǎng)站面臨的高并發(fā)、大流量等問(wèn)題,大型互聯(lián)網(wǎng)企業(yè)在實(shí)踐中提出了很多解決辦法。本文從這些解決辦法中,歸納出了進(jìn)行大型網(wǎng)站架構(gòu)設(shè)計(jì)時(shí)比較常見(jiàn)的模式。
架構(gòu)模式;分布式;大型網(wǎng)站
隨著互聯(lián)網(wǎng)的普及,人們的生活越來(lái)越離不開(kāi)網(wǎng)絡(luò)媒體,特別是近些年,像淘寶、京東這類大型電商網(wǎng)站迅速發(fā)展,微博、微信等大型社交類媒體用戶持續(xù)增加。為了提升網(wǎng)站服務(wù)性能,提高用戶的訪問(wèn)速度,作為這類大型網(wǎng)站的架構(gòu)師,已經(jīng)在長(zhǎng)期的開(kāi)發(fā)實(shí)踐中探索出了很多方法,這些解決方法又被更多網(wǎng)站重復(fù)使用,從而逐漸形成大型網(wǎng)站常用的架構(gòu)模式,主要有分層、分割、分布式集群、緩存、異步這幾種模式。
分層架構(gòu)模式是最常用的架構(gòu)模式,也被稱為N層架構(gòu)模式。分層架構(gòu)模式內(nèi)部的組件被組織成水平的分層,每一層執(zhí)行特定的功能。盡管分層架構(gòu)模式?jīng)]有指定分層的數(shù)量和類型,大部分都會(huì)分成四層:展示層(presentation)、業(yè)務(wù)層(business)、持久層(persistence)、數(shù)據(jù)庫(kù)層(database)。某些情況下,業(yè)務(wù)層和持久層會(huì)合并成一個(gè)業(yè)務(wù)層,尤其是當(dāng)持久化邏輯嵌入在業(yè)務(wù)層組件中。[1]一個(gè)典型的分層架構(gòu)模式如圖1所示:
圖1 分層架構(gòu)模式
分層架構(gòu)模式的每一層對(duì)應(yīng)著網(wǎng)站的特定功能。例如,持久層負(fù)責(zé)處理用戶交互和瀏覽器通信邏輯,業(yè)務(wù)層負(fù)責(zé)執(zhí)行特定的與請(qǐng)求相關(guān)的業(yè)務(wù)規(guī)則。架構(gòu)中的每一層將需要完成的工作進(jìn)行抽象,來(lái)滿足特定的業(yè)務(wù)請(qǐng)求。例如,展示層不需要知道也不需要關(guān)心如何獲取用戶數(shù)據(jù),它只需要將信息以特定的格式展示到界面上。[2]相似的,業(yè)務(wù)層不需要關(guān)心如何展示數(shù)據(jù)和數(shù)據(jù)從哪來(lái),它只需要從持久層獲取數(shù)據(jù),對(duì)數(shù)據(jù)進(jìn)行業(yè)務(wù)邏輯處理(計(jì)算、聚合等等),并將結(jié)果向上傳遞給展示層。
大型網(wǎng)站的功能復(fù)雜、應(yīng)用眾多,如果把這些功能和應(yīng)用部署在同一臺(tái)服務(wù)器上,那么將給服務(wù)器造成很大的壓力。因此在實(shí)踐中,架構(gòu)師要對(duì)整個(gè)網(wǎng)站的功能進(jìn)行拆分,然后分別部署,比如淘寶網(wǎng)就將天貓、聚劃算、阿里旅行等不同的功能模塊,部署在不同的服務(wù)器上。
對(duì)于大型網(wǎng)站,如何分割功能模塊,分割到什么程度?這是一件比較復(fù)雜的事情,首先必須理清網(wǎng)站的業(yè)務(wù)邏輯,做好網(wǎng)站的功能模塊劃分,然后編寫(xiě)相應(yīng)的功能類或函數(shù),形成高內(nèi)聚、低耦合的應(yīng)用模塊,這里面涉及到面向?qū)ο蟆⒔涌?、服?wù)等不同的設(shè)計(jì)原則,需要架構(gòu)師在開(kāi)發(fā)過(guò)程中不斷積累經(jīng)驗(yàn)。
當(dāng)一個(gè)網(wǎng)站的用戶訪問(wèn)量不斷增加,網(wǎng)站服務(wù)器就需要更多的CPU、內(nèi)存、存儲(chǔ)空間等資源,而提高單臺(tái)服務(wù)器的配置(比如升級(jí)CPU、提高硬盤(pán)容量)所需要的價(jià)格是比較昂貴的。因此一方面從經(jīng)濟(jì)利益方面考慮,可以采用分布式集群來(lái)進(jìn)行部署,方法是通過(guò)在服務(wù)器端部署更多數(shù)量的、價(jià)格相對(duì)低廉的PC Server,當(dāng)用戶向網(wǎng)站發(fā)出請(qǐng)求時(shí),負(fù)載均衡設(shè)備會(huì)根據(jù)當(dāng)前所有服務(wù)器的負(fù)載情況,將不同的用戶請(qǐng)求轉(zhuǎn)向不同的服務(wù)器。另一方面,當(dāng)網(wǎng)站架構(gòu)采用分布式集群后,可以有效防止服務(wù)器宕機(jī)的情況,比如某臺(tái)服務(wù)器突然發(fā)生故障,那么系統(tǒng)會(huì)自動(dòng)將用戶的請(qǐng)求轉(zhuǎn)給集群中正常運(yùn)行的其他服務(wù)器來(lái)處理。
目前大型網(wǎng)站普遍使用Hadoop及其MapReduce分布式計(jì)算框架進(jìn)行批處理計(jì)算,其特點(diǎn)是移動(dòng)計(jì)算,將計(jì)算程序分發(fā)到數(shù)據(jù)所在的位置以加速計(jì)算,典型的Hadoop分布式系統(tǒng)架構(gòu)如圖2所示。
圖2 Hadoop分布式系統(tǒng)架構(gòu)
Hadoop是可擴(kuò)展的集群,它采用非共享系統(tǒng)處理大規(guī)模并行數(shù)據(jù)。Hadoop的總體概念是單個(gè)節(jié)點(diǎn)對(duì)于整個(gè)集群的穩(wěn)定性和性能來(lái)說(shuō)并不重要。根據(jù)這種設(shè)計(jì)理念,我們可以在單個(gè)節(jié)點(diǎn)上選擇能夠高效處理少量(相對(duì)于整體的數(shù)據(jù)量大小)數(shù)據(jù)的硬件并且在硬件層面也無(wú)需過(guò)分追求穩(wěn)定性和冗余性。[3]Hadoop集群由多種類型的服務(wù)器所組成。它們中有主節(jié)點(diǎn),比如NameNode、備份NameNode以及JobTracker,還有稱為DataNode的工作節(jié)點(diǎn)。除了核心的Hadoop成員外,我們通常還會(huì)采用多種輔助服務(wù)器,比如網(wǎng)關(guān)、Hue服務(wù)器以及Hive元存儲(chǔ)服務(wù)器。
緩存就是用來(lái)避免頻繁的到主存儲(chǔ)器(一般來(lái)說(shuō)可能是數(shù)據(jù)庫(kù),結(jié)構(gòu)化的磁盤(pán)文件,遠(yuǎn)程網(wǎng)絡(luò)接口,程序接口等等提供數(shù)據(jù)返回的)獲取數(shù)據(jù)而建立的一個(gè)存取更快的臨時(shí)存儲(chǔ)器。緩存的主要目的是為了提高數(shù)據(jù)的讀取速度,因?yàn)榉?wù)器和瀏覽器之間存在著流量的瓶頸,所以讀取大容量數(shù)據(jù)時(shí),可以將緩存中的數(shù)據(jù)直接返回給瀏覽器,以減少瀏覽器與服務(wù)器之間數(shù)據(jù)交互,從而提高網(wǎng)站的性能。[4]網(wǎng)站緩存的實(shí)現(xiàn)方式主要有以下幾種:
(1)動(dòng)態(tài)頁(yè)面的靜態(tài)化。應(yīng)用程序把動(dòng)態(tài)生成的頁(yè)面緩存到文件服務(wù)器,以后用戶請(qǐng)求該動(dòng)態(tài)頁(yè)面,直接從文件服務(wù)器加載對(duì)應(yīng)的靜態(tài)緩存的html文件返回給用戶,這里面主要節(jié)省了應(yīng)用程序的執(zhí)行時(shí)間和數(shù)據(jù)庫(kù)訪問(wèn)時(shí)間,但是會(huì)增加緩存框架的加載和緩存查找的時(shí)間。
(2)把解釋執(zhí)行的開(kāi)發(fā)語(yǔ)言編譯成為目標(biāo)代碼。將解釋執(zhí)行的高級(jí)語(yǔ)言(如java,php),直接編譯成為平臺(tái)相關(guān)的目標(biāo)代碼,在java里面,比較著名的就是即時(shí)編譯器(JIT)。該方法主要節(jié)省了解釋執(zhí)行代碼的時(shí)間,但會(huì)增加即時(shí)編譯的時(shí)間。
(3)利用反向代理服務(wù)器的緩存。利用類似nginx的反向代理服務(wù)器,對(duì)請(qǐng)求的url對(duì)應(yīng)的輸出進(jìn)行緩存。一般情況下,當(dāng)用戶向web服務(wù)器發(fā)出請(qǐng)求時(shí),首先是經(jīng)過(guò)反向代理服務(wù)器,由反向代理服務(wù)器根據(jù)當(dāng)前服務(wù)器的資源使用情況,將不同用戶的請(qǐng)求轉(zhuǎn)發(fā)給不同的服務(wù)器,當(dāng)服務(wù)器處理完畢,把結(jié)果通過(guò)反向代理服務(wù)器返回給用戶。如果把用戶最經(jīng)常訪問(wèn)的數(shù)據(jù),緩存在反向代理服務(wù)器上,那么當(dāng)用戶發(fā)出請(qǐng)求后,直接就可以從反向代理服務(wù)器的緩存中獲取到數(shù)據(jù),這樣就加快了網(wǎng)站的響應(yīng)速度。
(4)客戶端瀏覽器緩存。當(dāng)客戶端發(fā)出的http請(qǐng)求中包含If-Modified-Since,如果服務(wù)器端代碼沒(méi)有修改,則返回302響應(yīng)代碼的請(qǐng)求響應(yīng)頭(內(nèi)容不返回);當(dāng)客戶端發(fā)現(xiàn)如果上次請(qǐng)求的頁(yè)面還未過(guò)期,通過(guò)Expires或者Cache-Control進(jìn)行辨別,直接顯示本機(jī)緩存的內(nèi)容,不與服務(wù)器進(jìn)行通信,節(jié)省了服務(wù)器執(zhí)行代碼時(shí)間以及數(shù)據(jù)傳輸時(shí)間。
在大型網(wǎng)站架構(gòu)中,采用異步模式可以降低網(wǎng)站的耦合度。當(dāng)用戶向web服務(wù)器發(fā)出請(qǐng)求,網(wǎng)站應(yīng)用層要對(duì)用戶的業(yè)務(wù)邏輯進(jìn)行處理,然后將處理的結(jié)果返回給用戶,若采用同步的架構(gòu)模式,當(dāng)業(yè)務(wù)邏輯處理的時(shí)間比較長(zhǎng)時(shí),用戶將出現(xiàn)長(zhǎng)時(shí)間的等待,大大降低了網(wǎng)站的用戶體驗(yàn)度。如果采用異步的方式,當(dāng)用戶發(fā)出請(qǐng)求后就可以繼續(xù)處理其他的業(yè)務(wù),web服務(wù)器接收到請(qǐng)求信息并處理完成后,通過(guò)異步的方式把執(zhí)行結(jié)果返回給用戶。
在大型網(wǎng)站中,一般采用消息隊(duì)列的方式來(lái)實(shí)現(xiàn)異步的架構(gòu)模式。網(wǎng)站的應(yīng)用層執(zhí)行完相關(guān)業(yè)務(wù)后,把消息給消息隊(duì)列然后直接返回客戶端,這樣就避免了處理復(fù)雜的業(yè)務(wù)邏輯然后同步的插入到數(shù)據(jù)庫(kù)后再返回造成的響應(yīng)延遲,實(shí)現(xiàn)了應(yīng)用解耦。[5]在很多網(wǎng)站上用戶提交訂單就是這么處理的,如圖3所示。
圖3 用戶訂單處理
訂單系統(tǒng)生成一個(gè)訂單號(hào)之后,將訂單丟給消息隊(duì)列,然后直接跳轉(zhuǎn)到訂單成功頁(yè)面,此時(shí)庫(kù)存系統(tǒng)對(duì)訂單還沒(méi)有處理完畢,因?yàn)槠渲猩婕暗奖容^多的數(shù)據(jù)操作,比如減庫(kù)存,數(shù)據(jù)庫(kù)同步等等,而用戶如果想要看到訂單詳情,需要點(diǎn)擊“訂單號(hào)”才能進(jìn)入到訂單詳情頁(yè),這種處理也是因?yàn)橄㈥?duì)列的非及時(shí)性。
大型網(wǎng)站架構(gòu)從來(lái)都不是一個(gè)預(yù)先定義的架構(gòu),而是一個(gè)演進(jìn)式的架構(gòu)。很少有一個(gè)網(wǎng)站從建站開(kāi)始,就能夠因具備大型網(wǎng)站的所有屬性而一成不變的,從最簡(jiǎn)單的LAMP架構(gòu),再到基于IOE的大型集中式應(yīng)用架構(gòu),再演變成時(shí)下的分布式應(yīng)用架構(gòu),隨著網(wǎng)站用戶規(guī)模的擴(kuò)大,架構(gòu)也在不斷演進(jìn)。
[1]韓樹(shù)河.大型網(wǎng)站應(yīng)用技術(shù)架構(gòu)演變的研究[J].吉林化工學(xué)院學(xué)報(bào),2015,01: 53-56.
[2]房輝,常盛.大型網(wǎng)站高性能架構(gòu)研究[J].信息系統(tǒng)工程,2015,12:76-77.
[3]張建超,張連堂.網(wǎng)站架構(gòu)演變技術(shù)研究[J].現(xiàn)代計(jì)算機(jī)(專業(yè)版),2012,04:53-55.
[4]包立輝,黃彥飛.高并發(fā)網(wǎng)站的架構(gòu)研究及解決方案[J].計(jì)算機(jī)科學(xué),2012,S2: 184-187.
[5]劉敏娜,解爭(zhēng)龍.基于SSI框架的高性能網(wǎng)站服務(wù)器端優(yōu)化技術(shù)[J].計(jì)算技術(shù)與自動(dòng)化,2014,03:139-144.
TP393
A
2095-7327(2016)-12-0151-02
2014年福建省大學(xué)生創(chuàng)新訓(xùn)練項(xiàng)目,項(xiàng)目名稱為基于PC和移動(dòng)終端的校園生活服務(wù)網(wǎng)站和APP設(shè)計(jì),項(xiàng)目編號(hào)為201413762044。
鄭逸凡(1983—),男,講師,軟件設(shè)計(jì)師,主要研究方向?yàn)閣eb開(kāi)發(fā)、軟件設(shè)計(jì)。