文|李鋼
大型公共服務(wù)網(wǎng)站架構(gòu)設(shè)計初探
文|李鋼
各級政府、公共事業(yè)部門面向公眾提供網(wǎng)上服務(wù)的網(wǎng)站(大型公共服務(wù)網(wǎng)站)面臨著高并發(fā)量、大數(shù)據(jù)量和可靠性至上的要求,文章探索了一個高可用、高性能、易擴展、安全可靠、基于NET的大型公共服務(wù)網(wǎng)站應(yīng)該具備哪些特點,應(yīng)該從哪些方面進行架構(gòu)設(shè)計。

互聯(lián)網(wǎng)誕生的短短20多年,對社會產(chǎn)生了翻天覆地的影響。各級政府、公共事業(yè)部門面向公眾提供網(wǎng)上服務(wù)的網(wǎng)站面臨著“高大上”(高并發(fā)量、大數(shù)據(jù)量和可靠性至上)的要求,從業(yè)務(wù)需求看,是網(wǎng)絡(luò)結(jié)構(gòu)靈活、業(yè)務(wù)變動快,從數(shù)據(jù)量看,用戶多、處理量大。如何打造一個高可用、高性能、易擴展、安全可靠的公共服務(wù)網(wǎng)站系統(tǒng)成為我們面臨和亟待解決的一個迫切問題。
與傳統(tǒng)的政務(wù)網(wǎng)站系統(tǒng)相比,大型公共服務(wù)網(wǎng)站由于覆蓋用戶范圍廣、業(yè)務(wù)流程復(fù)雜,使其具有以下顯著特點:
高并發(fā)率,大流量。需要面對高并發(fā)用戶,大流量訪問。如每年公務(wù)員考試報名及成績查詢時,提供服務(wù)的網(wǎng)站面臨著日均百萬級別的訪問量和查詢量。
可用性至上。系統(tǒng)7×24小時不間斷服務(wù)。大型網(wǎng)站宕機事件通常會成為新聞焦點,尤其是面向公眾提供公共服務(wù)類型的網(wǎng)站。近年來,公共服務(wù)網(wǎng)站越來越受到黑客或境外勢力的關(guān)注,被攻擊現(xiàn)象時常發(fā)生,不良影響屢見報端。
大型公共服務(wù)網(wǎng)站應(yīng)用系統(tǒng)除了以上顯著特點外,還具有占用的網(wǎng)絡(luò)及服務(wù)器資源多、數(shù)據(jù)海量且格式多樣、用戶分布廣泛、抗擊黑客攻擊性能好等特點。
傳統(tǒng)網(wǎng)站的架構(gòu)。傳統(tǒng)的網(wǎng)站系統(tǒng)主要以完成業(yè)務(wù)功能為目標(biāo),用戶量相對較少且峰值不明顯。因此考慮的網(wǎng)站的架構(gòu)時,一般采用的是比較簡潔的架構(gòu);在實戰(zhàn)中,采用以下比較通用、容易實現(xiàn)的三種架構(gòu)模式:
應(yīng)用與數(shù)據(jù)集中在一臺物理服務(wù)器上:一臺Server就滿足需要——網(wǎng)站應(yīng)用程序、數(shù)據(jù)庫、文件等所有資源都集中在一臺Server上。這種模式主要針對訪問人數(shù)較少(每日10萬人以下,且用戶訪問時間不集中)。
應(yīng)用和數(shù)據(jù)服務(wù)分離。三臺Server平天下——隨著業(yè)務(wù)量增加、訪問人數(shù)增多,單臺服務(wù)器部署不再適應(yīng)業(yè)務(wù)的發(fā)展,將應(yīng)用和數(shù)據(jù)分離后成三臺Sever(應(yīng)用服務(wù)器、文件服務(wù)器與數(shù)據(jù)庫服務(wù)器)。分離后三臺Server對硬件資源的需求各不相同:應(yīng)用服務(wù)器需要更快更強大的CPU,而數(shù)據(jù)庫服務(wù)器需要更快的硬盤和更大的內(nèi)存,文件服務(wù)器則需要更大的硬盤。
使用緩存改善網(wǎng)站性能。3+X Server模式——減少數(shù)據(jù)庫訪問壓力,提高網(wǎng)站的訪問速度。緩存又可以分為:本地緩存和遠程緩存(可以是分布式的),本地緩存訪問速度快,但數(shù)據(jù)量有限;遠程分布式緩存可以集群,因此容量不受限制。
大型網(wǎng)站的架構(gòu)。隨著到網(wǎng)站訪問量的不斷增加,傳統(tǒng)的網(wǎng)站架構(gòu)已不能滿足應(yīng)用需求,大型網(wǎng)站的技術(shù)架構(gòu)也隨之產(chǎn)生,而大型網(wǎng)站主要面對的技術(shù)挑戰(zhàn)是處理超大數(shù)量的用戶訪問和海量的數(shù)據(jù)處理,以及系統(tǒng)的可靠性、高性能、易拓展、易伸縮等特性的實現(xiàn)。
一個完整的大型網(wǎng)站設(shè)計時,一般需要從以下幾個方面考慮。
分層。分層是應(yīng)用系統(tǒng)設(shè)計中最常見的一種模式,將系統(tǒng)在橫向維度上切分成幾部分,每個部分負責(zé)一部分相對比較單一的職責(zé),然后通過上層調(diào)用下層的調(diào)用,組成一個完整系統(tǒng)。在大型網(wǎng)站架構(gòu)中也采用分層結(jié)構(gòu),一般分為應(yīng)用層、服務(wù)層、數(shù)據(jù)層。
分割。分層時將系統(tǒng)在橫向方面進行切分,分割是在縱向方面切分。網(wǎng)站越大、功能越復(fù)雜、服務(wù)和數(shù)據(jù)處理種類越多,將這些不同的功能和服務(wù)分割開來,包裝成高內(nèi)聚低耦合的模塊單元,一方面有助于軟件的開發(fā)和維護;另一方面便于不同模塊的分布式部署,提高網(wǎng)站的并發(fā)處理能力和功能擴展能力。
分布。分層和分割的一個主要目的是為了切分后的模塊便于分布部署。分布意味著可以使用更多的計算、存儲、網(wǎng)絡(luò)等資源完成同樣的功能,能夠處理大并發(fā)訪問和數(shù)據(jù)量的業(yè)務(wù)應(yīng)用。
集群。使用分布式雖然已經(jīng)將分層和分割后的模塊對立部署,但是對于用戶集中訪問的模塊,還需要將獨立部署的服務(wù)器集群化,即多臺服務(wù)器部署相同應(yīng)用構(gòu)成一個集群,通過負載均衡設(shè)備共同對外提供服務(wù)。
緩存。緩存就是將數(shù)據(jù)存放在距離計算最近的位置,以加快處理速度。
異步。在大型網(wǎng)站中,系統(tǒng)解耦合的手段除了分層、分割、分布外,還有一個重要的手段是異步。異步就是業(yè)務(wù)之間的消息傳遞是不同步的調(diào)用,而是將一個業(yè)務(wù)操作分成多個階段,每個階段之間通過共享數(shù)據(jù)的方式異步執(zhí)行。
.NET是微軟下一代的軟件平臺,它允許人們在其上構(gòu)建各種應(yīng)用。.NET平臺由于其資源豐富、技術(shù)水平先進的特點而被廣泛使用。構(gòu)建基于NET的公共服務(wù)網(wǎng)站,主要就是采用微軟的各個層面的系統(tǒng)軟件,包括NET framework、WEB服務(wù)器、數(shù)據(jù)庫、消息通信服務(wù)等,來完成網(wǎng)站建設(shè)。
架構(gòu)特點。這個架構(gòu)主要采用Microsoft Windows操作系統(tǒng)作為服務(wù)器和系統(tǒng)軟件:使用ASP.NET技術(shù);使用IIS作為Web容器;用Akamai CDN來緩存網(wǎng)頁;用Foundry ServerIron 來做負載均衡;sqlserver采用master-slave架構(gòu),slave負責(zé)讀取操作,master負責(zé)寫操作。
服務(wù)接口可以采用WCF,WCF支持事務(wù),支持多種通信方式。可以選用基于Web service的通信方式,也可以選用TCP/ IP socket的通信方式。
SessionState的技術(shù)方案。采用SessionState是ASP.NET默認的機制。ASP.NET的SessionState有幾種模式。InProc,StateServer,SqlServer模式和自定義模式。InProc不支持負載均衡的場景。只有StateServer和SqlServer模式才支持。
ViewState的技術(shù)方案。ViewState使服務(wù)器控件可以在往返行程中重新填充它們的屬性值,而程序員不需要編寫任何代碼。這些屬性值包括可見的屬性,也包括不可見的。
AJAX的請求量進行控制。AJAX帶來了很炫的效果,但是能適當(dāng)?shù)販p少調(diào)用AJAX調(diào)用次數(shù),比如能否合并AJAX的調(diào)用。
Server.Transfer和Response.Redirect。Server.Transfer發(fā)生在服務(wù)器端,而Response.Redirect發(fā)生在用戶瀏覽器中。會多一次HTTP請求。
設(shè)置Web garden。只要服務(wù)器資源允許,就可以建立Web garden,在同一個服務(wù)器上多開幾個工作進程。32位Windows上一個進程通常只能占用2G-3G內(nèi)存(因為高地址的2G或者1G是Windows本身用來裝配系統(tǒng)文件用的)。64位Windows上一個進程能占用的內(nèi)存相對32位大一點,但是服務(wù)器有比如100多G的內(nèi)存,可以適當(dāng)多開幾個工作進程。這可以增加單臺服務(wù)器的處理能力。
時至今日,大型網(wǎng)站的架構(gòu)技術(shù)方案已經(jīng)非常成熟,各種技術(shù)方案也逐漸產(chǎn)品化。但我們在搭建大型公共服務(wù)網(wǎng)站時,還是需要從業(yè)務(wù)需求出發(fā),不要一味的采用高、尖、新的技術(shù)。對于搭建大型的ASP.NET網(wǎng)站來說,建議從系統(tǒng)軟件和硬件上首先要保證負載均衡和可伸縮性,其次做到每一臺服務(wù)器的性能最大化,最后使得整個系統(tǒng)的服務(wù)能力最大化;從軟件設(shè)計架構(gòu)上,技術(shù)策略考慮如何分層以及分層模塊的部署,是否采用異步通信,如何提高模塊間的高效分布式調(diào)用等。
(作者單位:陜西省信息中心)