徐曉鶴(山東鋼鐵股份有限公司萊蕪分公司自動化部,山東 萊蕪 271104)
基于B/S的網上考試系統高并發性能優化研究與應用
徐曉鶴
(山東鋼鐵股份有限公司萊蕪分公司自動化部,山東 萊蕪 271104)
摘 要:網上考試系統隨著網絡信息技術的發展不斷得到推廣應用。隨著應用對象、考試規模的不斷擴大,高并發高數據量成為網上考試系統性能提升的瓶頸。該文結合萊鋼網上考試系統的系統設計與應用實踐,分析了系統在高并發應用條件下的瓶頸,并給出了解決方案。
關鍵詞:network exam;high—concurrency;研究應
網上考試是延伸了傳統考試考場的涵義,它利用網絡的無限廣闊空間,把考場從學校延伸到了家中、計算機房、辦公室及其它任何網絡所覆蓋的區域,并可隨時對考生進行考試,加上數據庫技術的利用,使考試變得更公平公正、更具權威性和可靠性。與傳統考試方式相比,計算機網絡考試可以突破地域限制、實現自動控制、自動閱卷評分等特性,大大節約人力、財務、物力。由丁B/S模式具有客戶端無需配置、開發效率高、易于管理和維護等特點,基于B/S模式的網絡考試系統正在逐漸成為主流應用。但每個客戶端用戶的訪問,都會占用服務器一定的資源。因此,在硬件設備和軟件算法復雜度不變的情況下,每臺應用服務器一般都存在一個最高用戶并發數,一旦并發訪問的用戶數量超過這個數量,就會引起系統性能急劇下降,甚至出現用戶訪問無響應等服務器拒絕服務的情況。
萊鋼網上考試系統主要用于業務技能競賽.需要保持各參賽人員試卷內容一致,試題隨機排序,下載、上傳必要的附列資料文檔,一般同時參加考試人數在六千人左右,甚至多達上萬人,經常出現并發訪問和提交大量數據,因此,如何優化網上考試系統設計策略,提升服務器性能,使之能滿足高并發大數據量的應用,是必須解決的問題。
根據網絡七層協議定義,在服務器端,可以在傳輸層或應用層對系統的介入層進行負載均衡考慮。考試系統為B/S架構,目前使用基于應用層HTTP協議的負載均衡技術較為成熟,且應用廣泛,使用既有的開源技術即可達到接入層的網絡負載均衡的目的。雖然在越底層做負載均衡效率越高,資源利用率越小,但是基于傳輸層TCP協議的LVS(Linux Virtual Server)維護難度較大,因此在應用層做負載均衡是最佳選擇,在本系統中LVS作為輔助方案。
NGINX是開源的基于HTTP的反向代理,除了具有HTTP包轉發的功能外,還能通過配置實現HTTP協議的負載均衡。在服務器上部署多套考試系統Server端程序后,在NGINX的配置文件nginx. conf中,添加負載均衡配置項,并根據各自服務器的性能及部署情況設置各自的權重,即可達到按需負載均衡的目的。
下面的配置表示,每6個對考試系統的HTTP請求中,3個請求會被轉發到10.10.10.110服務器,2個被轉發到10.10.10.111服務器,1個被轉發到10.10.10.112服務器。
upstream exameServer { server 10.10.10.110:8080 weight=3; server 10.10.10.111:8080 weight=2; server 10.10.10.112:8080; }
考試系統的核心業務為考試功能,除此外還包含了非核心業務如試卷生成、評分、查分、統計、通告等。一般情況下,考試功能是考試系統的核心,保證考試功能不被其他非核心業務的影響至關重要。系統需要將考試功能獨立成為單獨的進程,防止非核心業務功能因宕機、資源利用率過高等造成對考試的影響。
一次考試試卷中,往往有多種題型,題型不同,用戶在WEB界面上停留的時間長短不同,對后端產生的數據讀寫請求數也不相同。以選擇題和問答題為例,用戶在選擇題上停留的時間一般較短,短時間內產生的數據讀寫請求較多,單條數據的數據長度較小;但用戶在問答題上停留的時間一般會較長,產生的數據讀寫請求較少,但是單條數據的數據長度往往較大。
因此,可以根據題型的不同,將讀寫頻繁的頁面和讀寫較少的頁面獨立成不同的應用,并合理分配兩者之間的比例,將有利于提高對服務器資源的利用。根據統計用戶在選擇題上的平均停留時間為1分鐘,在問答題傷的平均時間為5分鐘,那么相對更多地部署選擇題對應的服務器端應用。在較大的并發讀寫請求情況下,將其進程部署個數分配為5:1將是比較合理的選擇。
考試系統的數據持久化層使用了數據庫作為存儲工具,多并發讀寫數據庫的情況下,鎖操作頻繁將導致系統花費大量時間在數據庫的讀寫上。因此,對數據庫進行讀寫分離將顯得尤為重要。
考試系統讀寫分離后,對數據的寫操作如考試功能作用于主庫,對數據的讀操作如查分功能作用于備庫。若單個備庫不能滿足查詢業務需求時,可建立多個備庫,并根據業務量合理分配備庫的使用程序。
4.1 數據庫分庫分表
考試系統的核心數據分為題庫和用戶考題數據,題庫用于記錄考題元數據,用戶考題數據用于記錄用戶的考試題目、用戶考試答案,以及考試時間等信息。題庫一般數據條數不多,使用單表即可滿足日常應用。但是用戶考試記錄隨著年限的增長,當達到百萬級別的時候,讀寫性能將明顯降低。根據需要,為每一個庫(也可以到表級別)設置一套數據文件(元數據文件、索引文件和數據文件),不同數據庫的文件又放置在不同的磁盤中,將大大提高磁盤的讀寫效率。
4.2 為考試設計的分庫分表
考試過程中的數據讀寫并發量,主要是用戶對自己的考試數據的讀寫與更新,可以按照用戶維度,進行分庫分表。在實際運行中發現,單庫單表只能支撐p人的同時考試,那么為了滿足t人同時考試,可以建立m個庫n張表,其中t <= m*n*p。在用戶考試時,根據用戶的登錄名稱或內部號碼等Hash到這m*n個庫表中,從而讓這些庫表共同分擔了t個人考試的讀寫請求。
作者簡介:徐曉鶴(1983-),男,山東濟南人,本科,工程師,研究方向:工業自動化控制軟件工程。