吳文哲
(遼河油田通信公司,遼寧 盤錦 124010)
1 產(chǎn)品研究背景及意義。由于游戲業(yè)務(wù)特殊性,華宇樂悠游游戲平臺的負(fù)載呈現(xiàn)出以下特點:
1.1 有活動開展時,活動時間內(nèi)服務(wù)器負(fù)載較大。
1.2 沒有活動時,工作日的8小時內(nèi)人數(shù)波動不大,負(fù)載較小。晚間20時至22時是游戲玩家上線高峰,負(fù)載較大。
1.3 國家法定節(jié)假日及雙休日,游戲人數(shù)比工作日增加較多,負(fù)載較大。
1.4 游戲服務(wù)和WEB服務(wù)的業(yè)務(wù)繁忙程度往往存在并發(fā)性。
1.5 不排除部分玩家短時間內(nèi)多次惡意刷新有數(shù)據(jù)統(tǒng)計的動態(tài)頁面,瞬間增加系統(tǒng)負(fù)荷。上述這些特點,會導(dǎo)致系統(tǒng)的負(fù)荷極不均衡,常常表現(xiàn)出系統(tǒng)運行不穩(wěn)定,容易死機、死鎖,給玩家的愉快體驗帶來極大地不方便,也給公司的經(jīng)濟效益、社會效益帶來嚴(yán)重影響。
2 技術(shù)方案的設(shè)計與實施
2.1 基于ASP.NET的性能優(yōu)化機制。要提升ASP.NET應(yīng)用程序的性能,最簡單、最有效的方式就是使用內(nèi)建的緩存引擎。然而,對于第一次來自于客戶端的動態(tài)頁面訪問請求,特別是該頁面存在大量需要讀取數(shù)據(jù)庫才能顯示的內(nèi)容時,再強大的緩存機制也無法保證服務(wù)器性能在首次訪問時有出色的表現(xiàn)。
2.2 Global.asax文件的作用
Global.asax文件(也稱為 ASP.NET應(yīng)用程序文件)是一個可選的文件,該文件包含響應(yīng)ASP.NET或 HTTP模塊所引發(fā)的應(yīng)用程序級別和會話級別事件的代碼。Global.asax文件駐留在 ASP.NET應(yīng)用程序的根目錄中。運行時,分析 Global.asax并將其編譯到一個動態(tài)生成的 .NETFramework類,該類是從 HttpApplication基類派生的。
2.3 利用Timer在ASP.NET中實現(xiàn)計劃任務(wù)
.NETFramework為我們提供了3種類型的Timer,分別是:ServerTimer(System.Timers.Timer),ThreadTimer(System.Threading.Timer)和WindowsTimer(System.Windows.Forms.Timer)。其中WindowsTimer和WinAPI中的Timer一樣,是基于消息的,而且是單線程的。另外兩個Timer則不同于WindowsTimer,它們是基于ThreadPool的,這樣最大的好處就是,產(chǎn)生的時間間隔準(zhǔn)確均勻。ServerTimer和ThreadTimer的區(qū)別在于,ServerTimer是基于事件的,而ThreadTimer是基于Callback的。相比之下ThreadTimer更輕量級一些。目前平臺用ThreadTimer
2.4 數(shù)據(jù)自動處理流程。數(shù)據(jù)自動處理流程圖如圖2-1所示:
2.4.1 樂悠游后臺管理站點為實現(xiàn)計劃任務(wù),Global.asax.cs文件部分代碼如下:
2.4.2 為了實現(xiàn)多個任務(wù)在一定時間間隔內(nèi)計劃進行,Jobs.cs文件代碼略。
2.4.3 根目錄下的配置文件jobs.config文件部分代碼如下:
2.4.4 為了實現(xiàn)單個具體任務(wù)按照計劃進行,Job.cs文件代碼略。
2.4.5 以繼承自IJob類的GameInOutStock-Total類為例,詳細到具體任務(wù)的執(zhí)行流程,GameInOutStockTotal.cs文件代碼略。
2.4.6 為了準(zhǔn)確記錄計劃任務(wù)的執(zhí)行情況,SimpleLogger.cs文件作用是記錄自動執(zhí)行任務(wù)的日志,代碼略。
2.5 WEB服務(wù)負(fù)載均衡系統(tǒng)的設(shè)計與實現(xiàn)。綜合以上文件代碼,當(dāng)系統(tǒng)每天按照計劃執(zhí)行任務(wù)后,當(dāng)天所有玩家的輸贏游戲幣就統(tǒng)計出來了,在任務(wù)的最后,我們還新建立了一個表(gameInOutStock),用來保存統(tǒng)計所得數(shù)據(jù)。
一般來說,統(tǒng)計信息的獲得應(yīng)該是實時查詢數(shù)據(jù)庫所得,當(dāng)涉及到多表關(guān)聯(lián)、跨表查詢時,系統(tǒng)的性能會降低很多。這里我們利用ASP.NET的自動執(zhí)行任務(wù)機制,在系統(tǒng)負(fù)荷最小的時間段(比如凌晨時間),自動執(zhí)行多表關(guān)聯(lián)查詢,并且建立新表,把日后將要查詢所得的結(jié)果提前存入數(shù)據(jù)庫。
這樣做的好處主要有兩點:一、提升系統(tǒng)性能。當(dāng)要查詢信息時,直接從已經(jīng)生成好的數(shù)據(jù)表中讀取信息,不用涉及關(guān)聯(lián)查詢。二、提高數(shù)據(jù)庫系統(tǒng)安全性。如果每次查詢信息都要多表聯(lián)動,由于涉及到的數(shù)據(jù)表都是和主要業(yè)務(wù)息息相關(guān)的信息,同時這些表中的數(shù)據(jù)實時更新,對于這種存放重要信息的表來說,頻繁的讀寫操作無疑給數(shù)據(jù)庫增加很大的負(fù)擔(dān)。如果在系統(tǒng)閑時能把重要信息查詢出來并且保存到新表,則日后查詢新表即可完成查詢?nèi)蝿?wù)。
2.6 負(fù)載均衡系統(tǒng)的推廣實踐
對于管理員后臺系統(tǒng)來說,由于授權(quán)進入后臺的管理員人數(shù)確定,查詢訪問量不大,這樣做的優(yōu)點除了查詢時間有效減少之外,并沒有太明顯的效果。但是對于公網(wǎng)運行的平臺來說,推廣這種負(fù)載均衡系統(tǒng)就非常有必要了。
http://www.liaoheonline.com/associator.aspx為會員中心頁,要正確顯示該頁左下方的會員等級排行,通常情況下,要到db_lobbyv2庫的tb_account表 中 根 據(jù) a_viptime、a_vipapptime 和a_vipexptime三個字段值計算出該玩家當(dāng)前的會員注冊天數(shù),并根據(jù)天數(shù)計算出會員等級,然后返回給動態(tài)頁面顯示出來。對于少量訪問該頁面的玩家來說,這些計算量和查詢訪問量顯然不算什么。然而,一旦遭遇到游戲高峰期,對于玩家詳細信息表這類至關(guān)重要的數(shù)據(jù)庫表讀寫操作頻繁時,將可能造成難以想象的后果??赡軒淼臑?zāi)難是,WEB服務(wù)器由于換算時間和計算等級量過大導(dǎo)致宕機、數(shù)據(jù)庫服務(wù)器由于眾多玩家同時查詢訪問同一張數(shù)據(jù)表而死機和網(wǎng)絡(luò)擁塞等等。為了防止出現(xiàn)以上情況,我們在后臺管理系統(tǒng)中按天統(tǒng)計會員天數(shù)和等級,并且保存至新的數(shù)據(jù)庫表中。這樣當(dāng)用戶再訪問該頁面時,就不必?fù)?dān)心以上不利于公網(wǎng)平臺運行的情況發(fā)生了。
[1]莊紀(jì)林.一個基于HTTP重定向的Web服務(wù)負(fù)載均衡系統(tǒng)的設(shè)計和實現(xiàn).北京大學(xué)圖書館,北京,【期刊】現(xiàn)代圖書情報技術(shù),2008-02-25.