吳文哲
(遼河油田通信公司,遼寧 盤錦 124010)
1 產品研究背景及意義。由于游戲業務特殊性,華宇樂悠游游戲平臺的負載呈現出以下特點:
1.1 有活動開展時,活動時間內服務器負載較大。
1.2 沒有活動時,工作日的8小時內人數波動不大,負載較小。晚間20時至22時是游戲玩家上線高峰,負載較大。
1.3 國家法定節假日及雙休日,游戲人數比工作日增加較多,負載較大。
1.4 游戲服務和WEB服務的業務繁忙程度往往存在并發性。
1.5 不排除部分玩家短時間內多次惡意刷新有數據統計的動態頁面,瞬間增加系統負荷。上述這些特點,會導致系統的負荷極不均衡,常常表現出系統運行不穩定,容易死機、死鎖,給玩家的愉快體驗帶來極大地不方便,也給公司的經濟效益、社會效益帶來嚴重影響。
2 技術方案的設計與實施
2.1 基于ASP.NET的性能優化機制。要提升ASP.NET應用程序的性能,最簡單、最有效的方式就是使用內建的緩存引擎。然而,對于第一次來自于客戶端的動態頁面訪問請求,特別是該頁面存在大量需要讀取數據庫才能顯示的內容時,再強大的緩存機制也無法保證服務器性能在首次訪問時有出色的表現。
2.2 Global.asax文件的作用
Global.asax文件(也稱為 ASP.NET應用程序文件)是一個可選的文件,該文件包含響應ASP.NET或 HTTP模塊所引發的應用程序級別和會話級別事件的代碼。Global.asax文件駐留在 ASP.NET應用程序的根目錄中。運行時,分析 Global.asax并將其編譯到一個動態生成的 .NETFramework類,該類是從 HttpApplication基類派生的。
2.3 利用Timer在ASP.NET中實現計劃任務
.NETFramework為我們提供了3種類型的Timer,分別是:ServerTimer(System.Timers.Timer),ThreadTimer(System.Threading.Timer)和WindowsTimer(System.Windows.Forms.Timer)。其中WindowsTimer和WinAPI中的Timer一樣,是基于消息的,而且是單線程的。另外兩個Timer則不同于WindowsTimer,它們是基于ThreadPool的,這樣最大的好處就是,產生的時間間隔準確均勻。ServerTimer和ThreadTimer的區別在于,ServerTimer是基于事件的,而ThreadTimer是基于Callback的。相比之下ThreadTimer更輕量級一些。目前平臺用ThreadTimer
2.4 數據自動處理流程。數據自動處理流程圖如圖2-1所示:

2.4.1 樂悠游后臺管理站點為實現計劃任務,Global.asax.cs文件部分代碼如下:

2.4.2 為了實現多個任務在一定時間間隔內計劃進行,Jobs.cs文件代碼略。
2.4.3 根目錄下的配置文件jobs.config文件部分代碼如下:


2.4.4 為了實現單個具體任務按照計劃進行,Job.cs文件代碼略。
2.4.5 以繼承自IJob類的GameInOutStock-Total類為例,詳細到具體任務的執行流程,GameInOutStockTotal.cs文件代碼略。
2.4.6 為了準確記錄計劃任務的執行情況,SimpleLogger.cs文件作用是記錄自動執行任務的日志,代碼略。
2.5 WEB服務負載均衡系統的設計與實現。綜合以上文件代碼,當系統每天按照計劃執行任務后,當天所有玩家的輸贏游戲幣就統計出來了,在任務的最后,我們還新建立了一個表(gameInOutStock),用來保存統計所得數據。
一般來說,統計信息的獲得應該是實時查詢數據庫所得,當涉及到多表關聯、跨表查詢時,系統的性能會降低很多。這里我們利用ASP.NET的自動執行任務機制,在系統負荷最小的時間段(比如凌晨時間),自動執行多表關聯查詢,并且建立新表,把日后將要查詢所得的結果提前存入數據庫。
這樣做的好處主要有兩點:一、提升系統性能。當要查詢信息時,直接從已經生成好的數據表中讀取信息,不用涉及關聯查詢。二、提高數據庫系統安全性。如果每次查詢信息都要多表聯動,由于涉及到的數據表都是和主要業務息息相關的信息,同時這些表中的數據實時更新,對于這種存放重要信息的表來說,頻繁的讀寫操作無疑給數據庫增加很大的負擔。如果在系統閑時能把重要信息查詢出來并且保存到新表,則日后查詢新表即可完成查詢任務。
2.6 負載均衡系統的推廣實踐
對于管理員后臺系統來說,由于授權進入后臺的管理員人數確定,查詢訪問量不大,這樣做的優點除了查詢時間有效減少之外,并沒有太明顯的效果。但是對于公網運行的平臺來說,推廣這種負載均衡系統就非常有必要了。
http://www.liaoheonline.com/associator.aspx為會員中心頁,要正確顯示該頁左下方的會員等級排行,通常情況下,要到db_lobbyv2庫的tb_account表 中 根 據 a_viptime、a_vipapptime 和a_vipexptime三個字段值計算出該玩家當前的會員注冊天數,并根據天數計算出會員等級,然后返回給動態頁面顯示出來。對于少量訪問該頁面的玩家來說,這些計算量和查詢訪問量顯然不算什么。然而,一旦遭遇到游戲高峰期,對于玩家詳細信息表這類至關重要的數據庫表讀寫操作頻繁時,將可能造成難以想象的后果。可能帶來的災難是,WEB服務器由于換算時間和計算等級量過大導致宕機、數據庫服務器由于眾多玩家同時查詢訪問同一張數據表而死機和網絡擁塞等等。為了防止出現以上情況,我們在后臺管理系統中按天統計會員天數和等級,并且保存至新的數據庫表中。這樣當用戶再訪問該頁面時,就不必擔心以上不利于公網平臺運行的情況發生了。
[1]莊紀林.一個基于HTTP重定向的Web服務負載均衡系統的設計和實現.北京大學圖書館,北京,【期刊】現代圖書情報技術,2008-02-25.