鄭逸凡
(福州外語外貿(mào)學(xué)院福建福州350202)
大型網(wǎng)站的架構(gòu)模式研究
鄭逸凡
(福州外語外貿(mào)學(xué)院福建福州350202)
隨著網(wǎng)站規(guī)模的不斷擴大,用戶的訪問量逐漸增加,簡單的LAMP架構(gòu)無法支撐大型網(wǎng)站快速發(fā)展的業(yè)務(wù)需求。為了解決大型網(wǎng)站面臨的高并發(fā)、大流量等問題,大型互聯(lián)網(wǎng)企業(yè)在實踐中提出了很多解決辦法。本文從這些解決辦法中,歸納出了進行大型網(wǎng)站架構(gòu)設(shè)計時比較常見的模式。
架構(gòu)模式;分布式;大型網(wǎng)站
隨著互聯(lián)網(wǎng)的普及,人們的生活越來越離不開網(wǎng)絡(luò)媒體,特別是近些年,像淘寶、京東這類大型電商網(wǎng)站迅速發(fā)展,微博、微信等大型社交類媒體用戶持續(xù)增加。為了提升網(wǎng)站服務(wù)性能,提高用戶的訪問速度,作為這類大型網(wǎng)站的架構(gòu)師,已經(jīng)在長期的開發(fā)實踐中探索出了很多方法,這些解決方法又被更多網(wǎng)站重復(fù)使用,從而逐漸形成大型網(wǎng)站常用的架構(gòu)模式,主要有分層、分割、分布式集群、緩存、異步這幾種模式。
分層架構(gòu)模式是最常用的架構(gòu)模式,也被稱為N層架構(gòu)模式。分層架構(gòu)模式內(nèi)部的組件被組織成水平的分層,每一層執(zhí)行特定的功能。盡管分層架構(gòu)模式?jīng)]有指定分層的數(shù)量和類型,大部分都會分成四層:展示層(presentation)、業(yè)務(wù)層(business)、持久層(persistence)、數(shù)據(jù)庫層(database)。某些情況下,業(yè)務(wù)層和持久層會合并成一個業(yè)務(wù)層,尤其是當(dāng)持久化邏輯嵌入在業(yè)務(wù)層組件中。[1]一個典型的分層架構(gòu)模式如圖1所示:

圖1 分層架構(gòu)模式
分層架構(gòu)模式的每一層對應(yīng)著網(wǎng)站的特定功能。例如,持久層負責(zé)處理用戶交互和瀏覽器通信邏輯,業(yè)務(wù)層負責(zé)執(zhí)行特定的與請求相關(guān)的業(yè)務(wù)規(guī)則。架構(gòu)中的每一層將需要完成的工作進行抽象,來滿足特定的業(yè)務(wù)請求。例如,展示層不需要知道也不需要關(guān)心如何獲取用戶數(shù)據(jù),它只需要將信息以特定的格式展示到界面上。[2]相似的,業(yè)務(wù)層不需要關(guān)心如何展示數(shù)據(jù)和數(shù)據(jù)從哪來,它只需要從持久層獲取數(shù)據(jù),對數(shù)據(jù)進行業(yè)務(wù)邏輯處理(計算、聚合等等),并將結(jié)果向上傳遞給展示層。
大型網(wǎng)站的功能復(fù)雜、應(yīng)用眾多,如果把這些功能和應(yīng)用部署在同一臺服務(wù)器上,那么將給服務(wù)器造成很大的壓力。因此在實踐中,架構(gòu)師要對整個網(wǎng)站的功能進行拆分,然后分別部署,比如淘寶網(wǎng)就將天貓、聚劃算、阿里旅行等不同的功能模塊,部署在不同的服務(wù)器上。
對于大型網(wǎng)站,如何分割功能模塊,分割到什么程度?這是一件比較復(fù)雜的事情,首先必須理清網(wǎng)站的業(yè)務(wù)邏輯,做好網(wǎng)站的功能模塊劃分,然后編寫相應(yīng)的功能類或函數(shù),形成高內(nèi)聚、低耦合的應(yīng)用模塊,這里面涉及到面向?qū)ο蟆⒔涌凇⒎?wù)等不同的設(shè)計原則,需要架構(gòu)師在開發(fā)過程中不斷積累經(jīng)驗。
當(dāng)一個網(wǎng)站的用戶訪問量不斷增加,網(wǎng)站服務(wù)器就需要更多的CPU、內(nèi)存、存儲空間等資源,而提高單臺服務(wù)器的配置(比如升級CPU、提高硬盤容量)所需要的價格是比較昂貴的。因此一方面從經(jīng)濟利益方面考慮,可以采用分布式集群來進行部署,方法是通過在服務(wù)器端部署更多數(shù)量的、價格相對低廉的PC Server,當(dāng)用戶向網(wǎng)站發(fā)出請求時,負載均衡設(shè)備會根據(jù)當(dāng)前所有服務(wù)器的負載情況,將不同的用戶請求轉(zhuǎn)向不同的服務(wù)器。另一方面,當(dāng)網(wǎng)站架構(gòu)采用分布式集群后,可以有效防止服務(wù)器宕機的情況,比如某臺服務(wù)器突然發(fā)生故障,那么系統(tǒng)會自動將用戶的請求轉(zhuǎn)給集群中正常運行的其他服務(wù)器來處理。
目前大型網(wǎng)站普遍使用Hadoop及其MapReduce分布式計算框架進行批處理計算,其特點是移動計算,將計算程序分發(fā)到數(shù)據(jù)所在的位置以加速計算,典型的Hadoop分布式系統(tǒng)架構(gòu)如圖2所示。

圖2 Hadoop分布式系統(tǒng)架構(gòu)
Hadoop是可擴展的集群,它采用非共享系統(tǒng)處理大規(guī)模并行數(shù)據(jù)。Hadoop的總體概念是單個節(jié)點對于整個集群的穩(wěn)定性和性能來說并不重要。根據(jù)這種設(shè)計理念,我們可以在單個節(jié)點上選擇能夠高效處理少量(相對于整體的數(shù)據(jù)量大小)數(shù)據(jù)的硬件并且在硬件層面也無需過分追求穩(wěn)定性和冗余性。[3]Hadoop集群由多種類型的服務(wù)器所組成。它們中有主節(jié)點,比如NameNode、備份NameNode以及JobTracker,還有稱為DataNode的工作節(jié)點。除了核心的Hadoop成員外,我們通常還會采用多種輔助服務(wù)器,比如網(wǎng)關(guān)、Hue服務(wù)器以及Hive元存儲服務(wù)器。
緩存就是用來避免頻繁的到主存儲器(一般來說可能是數(shù)據(jù)庫,結(jié)構(gòu)化的磁盤文件,遠程網(wǎng)絡(luò)接口,程序接口等等提供數(shù)據(jù)返回的)獲取數(shù)據(jù)而建立的一個存取更快的臨時存儲器。緩存的主要目的是為了提高數(shù)據(jù)的讀取速度,因為服務(wù)器和瀏覽器之間存在著流量的瓶頸,所以讀取大容量數(shù)據(jù)時,可以將緩存中的數(shù)據(jù)直接返回給瀏覽器,以減少瀏覽器與服務(wù)器之間數(shù)據(jù)交互,從而提高網(wǎng)站的性能。[4]網(wǎng)站緩存的實現(xiàn)方式主要有以下幾種:
(1)動態(tài)頁面的靜態(tài)化。應(yīng)用程序把動態(tài)生成的頁面緩存到文件服務(wù)器,以后用戶請求該動態(tài)頁面,直接從文件服務(wù)器加載對應(yīng)的靜態(tài)緩存的html文件返回給用戶,這里面主要節(jié)省了應(yīng)用程序的執(zhí)行時間和數(shù)據(jù)庫訪問時間,但是會增加緩存框架的加載和緩存查找的時間。
(2)把解釋執(zhí)行的開發(fā)語言編譯成為目標(biāo)代碼。將解釋執(zhí)行的高級語言(如java,php),直接編譯成為平臺相關(guān)的目標(biāo)代碼,在java里面,比較著名的就是即時編譯器(JIT)。該方法主要節(jié)省了解釋執(zhí)行代碼的時間,但會增加即時編譯的時間。
(3)利用反向代理服務(wù)器的緩存。利用類似nginx的反向代理服務(wù)器,對請求的url對應(yīng)的輸出進行緩存。一般情況下,當(dāng)用戶向web服務(wù)器發(fā)出請求時,首先是經(jīng)過反向代理服務(wù)器,由反向代理服務(wù)器根據(jù)當(dāng)前服務(wù)器的資源使用情況,將不同用戶的請求轉(zhuǎn)發(fā)給不同的服務(wù)器,當(dāng)服務(wù)器處理完畢,把結(jié)果通過反向代理服務(wù)器返回給用戶。如果把用戶最經(jīng)常訪問的數(shù)據(jù),緩存在反向代理服務(wù)器上,那么當(dāng)用戶發(fā)出請求后,直接就可以從反向代理服務(wù)器的緩存中獲取到數(shù)據(jù),這樣就加快了網(wǎng)站的響應(yīng)速度。
(4)客戶端瀏覽器緩存。當(dāng)客戶端發(fā)出的http請求中包含If-Modified-Since,如果服務(wù)器端代碼沒有修改,則返回302響應(yīng)代碼的請求響應(yīng)頭(內(nèi)容不返回);當(dāng)客戶端發(fā)現(xiàn)如果上次請求的頁面還未過期,通過Expires或者Cache-Control進行辨別,直接顯示本機緩存的內(nèi)容,不與服務(wù)器進行通信,節(jié)省了服務(wù)器執(zhí)行代碼時間以及數(shù)據(jù)傳輸時間。
在大型網(wǎng)站架構(gòu)中,采用異步模式可以降低網(wǎng)站的耦合度。當(dāng)用戶向web服務(wù)器發(fā)出請求,網(wǎng)站應(yīng)用層要對用戶的業(yè)務(wù)邏輯進行處理,然后將處理的結(jié)果返回給用戶,若采用同步的架構(gòu)模式,當(dāng)業(yè)務(wù)邏輯處理的時間比較長時,用戶將出現(xiàn)長時間的等待,大大降低了網(wǎng)站的用戶體驗度。如果采用異步的方式,當(dāng)用戶發(fā)出請求后就可以繼續(xù)處理其他的業(yè)務(wù),web服務(wù)器接收到請求信息并處理完成后,通過異步的方式把執(zhí)行結(jié)果返回給用戶。
在大型網(wǎng)站中,一般采用消息隊列的方式來實現(xiàn)異步的架構(gòu)模式。網(wǎng)站的應(yīng)用層執(zhí)行完相關(guān)業(yè)務(wù)后,把消息給消息隊列然后直接返回客戶端,這樣就避免了處理復(fù)雜的業(yè)務(wù)邏輯然后同步的插入到數(shù)據(jù)庫后再返回造成的響應(yīng)延遲,實現(xiàn)了應(yīng)用解耦。[5]在很多網(wǎng)站上用戶提交訂單就是這么處理的,如圖3所示。

圖3 用戶訂單處理
訂單系統(tǒng)生成一個訂單號之后,將訂單丟給消息隊列,然后直接跳轉(zhuǎn)到訂單成功頁面,此時庫存系統(tǒng)對訂單還沒有處理完畢,因為其中涉及到比較多的數(shù)據(jù)操作,比如減庫存,數(shù)據(jù)庫同步等等,而用戶如果想要看到訂單詳情,需要點擊“訂單號”才能進入到訂單詳情頁,這種處理也是因為消息隊列的非及時性。
大型網(wǎng)站架構(gòu)從來都不是一個預(yù)先定義的架構(gòu),而是一個演進式的架構(gòu)。很少有一個網(wǎng)站從建站開始,就能夠因具備大型網(wǎng)站的所有屬性而一成不變的,從最簡單的LAMP架構(gòu),再到基于IOE的大型集中式應(yīng)用架構(gòu),再演變成時下的分布式應(yīng)用架構(gòu),隨著網(wǎng)站用戶規(guī)模的擴大,架構(gòu)也在不斷演進。
[1]韓樹河.大型網(wǎng)站應(yīng)用技術(shù)架構(gòu)演變的研究[J].吉林化工學(xué)院學(xué)報,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)代計算機(專業(yè)版),2012,04:53-55.
[4]包立輝,黃彥飛.高并發(fā)網(wǎng)站的架構(gòu)研究及解決方案[J].計算機科學(xué),2012,S2: 184-187.
[5]劉敏娜,解爭龍.基于SSI框架的高性能網(wǎng)站服務(wù)器端優(yōu)化技術(shù)[J].計算技術(shù)與自動化,2014,03:139-144.
TP393
A
2095-7327(2016)-12-0151-02
2014年福建省大學(xué)生創(chuàng)新訓(xùn)練項目,項目名稱為基于PC和移動終端的校園生活服務(wù)網(wǎng)站和APP設(shè)計,項目編號為201413762044。
鄭逸凡(1983—),男,講師,軟件設(shè)計師,主要研究方向為web開發(fā)、軟件設(shè)計。