王飛飛 徐帥武
摘要:針對現(xiàn)有程序在線評測系統(tǒng)存在的運行效率低、功能較為單一的問題,該文設(shè)計實現(xiàn)了一基于Koa2的PDSUOJ系統(tǒng),該系統(tǒng)前端與服務(wù)端框架分別采用Rect與Midway,進行數(shù)據(jù)存儲與緩存時使用PostgreSQL與Redis,同時為了滿足服務(wù)之間隔離與快速部署的需求采用Docker作為各個服務(wù)的運行容器。該系統(tǒng)主要實現(xiàn)了用戶信息管理、用戶分組信息管理、題目信息管理、題目提交評測、提交數(shù)據(jù)管理等功能,系統(tǒng)界面簡單友好,運行效率高,可以滿足用戶在線評測程序的需求。
關(guān)鍵詞:評測系統(tǒng);服務(wù)端;數(shù)據(jù)管理
中圖分類號:TP311 文獻標識碼:A
文章編號:1009-3044(2020)03-0094-02
1 概述
隨著計算機編程技術(shù)的發(fā)展,各類程序在線評測系統(tǒng)開始出現(xiàn)[1-3],但是現(xiàn)有的系統(tǒng)大多主要以學生競賽訓練為主,與教學工作相結(jié)合用于程序課程考核的較少,因此功能較為單一,在實現(xiàn)學生分組、課程分類、評測結(jié)果數(shù)據(jù)分組匯總方面存在欠缺,且存在代碼耦合嚴重難以二次開發(fā)、系統(tǒng)擴展性與數(shù)據(jù)安全性較差等問題。為了更好地滿足教學需要,本文在對現(xiàn)有系統(tǒng)進行分析研究的基礎(chǔ)上,根據(jù)學生與教師在系統(tǒng)性能、功能和擴展性的需求,確定系統(tǒng)功能與實現(xiàn)該系統(tǒng)所采用的技術(shù),設(shè)計實現(xiàn)了一在線評測系統(tǒng)。
2 系統(tǒng)功能需求分析與相關(guān)技術(shù)
2.1 系統(tǒng)功能需求分析
通過對現(xiàn)有在線評測平臺的分析[4-6],在對教師與學生的需求進行調(diào)研的基礎(chǔ)上,將系統(tǒng)用戶分為兩類:普通用戶與特權(quán)用戶。
普通用戶功能包括個人信息管理、查看排行、題目查詢與瀏覽、題目提交與程序考核管理。其中個人信息管理包括用戶注冊登錄、信息查看與信息修改;查看排行可以分組查看,也可以查看他人的成績信息;題目查詢與瀏覽可以實現(xiàn)分類查詢、模糊搜索、題目自定義排序與查看詳情;題目提交為答題完畢后提交題目。
特權(quán)用戶功能包括用戶管理、題目管理、用戶組信息管理、考核管理。其中用戶管理包括對注冊用戶個人信息進行查看、刪除、修改等,對用戶近期答題情況、錯誤率、排名等情況進行查看;題目管理包括對題目的添加、修改、刪除、隱藏、分類等操作;用戶組信息管理包括新增用戶組,實現(xiàn)對用戶組信息的修改與刪除,對用戶組內(nèi)成員信息的管理;考核管理包括出題、選擇參加學生、對提交題目進行評判等。
2.2 相關(guān)技術(shù)分析
本系統(tǒng)前端開發(fā)采用Rect,它可以在數(shù)據(jù)發(fā)生變化時檢測到相應(yīng)信息以完成對視圖的自動更新,從而實現(xiàn)數(shù)據(jù)到視圖的映射;可以通過Rect構(gòu)建組件實現(xiàn)代碼復用,也可以實現(xiàn)與其他框架的組合使用;Rect內(nèi)部實現(xiàn)了Virtual DOM系統(tǒng),當數(shù)據(jù)量大且變化快時只更新變化的數(shù)據(jù),有效地改善了性能瓶頸問題。
Midway是基于Koa2的后端框架,與Koa2相比增加了許多便于開發(fā)的中間件,其開發(fā)語言采用TypeScript,有利于程序的后期擴展,同時兼容Egg.js的寫法,可以利用各種中間件加快開發(fā)速度,同時內(nèi)置了單元測試。軟件開發(fā)過程中,程序在不同機器上會出現(xiàn)不兼容的狀況,不同的技術(shù)也會存在不同的環(huán)境依賴,此類問題一般采用虛擬機或者Docker技術(shù)解決,由于Docker在啟動、硬盤使用、性能、系統(tǒng)支持量方面存在的優(yōu)勢,本系統(tǒng)采用Docker技術(shù)來解決環(huán)境配置問題。
3 系統(tǒng)設(shè)計與實現(xiàn)
3.1 系統(tǒng)設(shè)計
本系統(tǒng)主體架構(gòu)包括前端顯示、后端邏輯層與判題服務(wù)三部分。其中Rect實現(xiàn)前端展示與操作邏輯,SPA模式的采用使頁面切換等由前端處理,服務(wù)端僅提供頁面數(shù)據(jù),從而減少了網(wǎng)絡(luò)請求數(shù)據(jù)量,頁面展示時為無刷新的切換方式,增加了呈現(xiàn)速度。Service層采用TypeScript作為開發(fā)語言進行程序編寫,以Node.js為程序運行環(huán)境,如果后端服務(wù)壓力過大則可以開啟多個,與前端服務(wù)器一起實現(xiàn)負載均衡,減輕后端服務(wù)壓力,具體如圖l所示。
用戶提交答案到服務(wù)端后,服務(wù)端先通過一次Hash對重復提交進行過濾,然后將信息發(fā)送至Judge服務(wù)器,如果當前判題服務(wù)空閑則直接進行處理,否則將信息存入Redis緩存隊列,當有判題核心處于空閑狀態(tài)時則從緩存中進行讀取判題,處理后將結(jié)果返回至服務(wù)端。具體工作流程如下:
1)評測服務(wù)接受評測請求;
2)判斷是否空閑,如果空閑則執(zhí)行下一步,否則處于等待狀態(tài);
3)對程序進行編譯,如果編譯失敗則跳轉(zhuǎn)到Error,否則執(zhí)行下一步;
(Error)響應(yīng)異常,跳轉(zhuǎn)到8);
4)讀取評測數(shù)據(jù),運行編譯后的程序?qū)Ξa(chǎn)生的結(jié)果進行比較;
5)如果結(jié)果正確則跳轉(zhuǎn)到下一步,否則跳轉(zhuǎn)到Error;
6)判斷是否還有下一組數(shù)據(jù),如果有則跳轉(zhuǎn)到4),否則執(zhí)行下一步;
7)響應(yīng)請求結(jié)果為成功,執(zhí)行下一步;
8)判斷緩存隊列中是否存在等待中的請求,如果存在則跳轉(zhuǎn)到3),否則結(jié)束程序。
3.2 系統(tǒng)實現(xiàn)
本系統(tǒng)實現(xiàn)的功能有權(quán)限管理、用戶注冊登錄、題目提交、用戶管理、用戶組管理、題目管理、系統(tǒng)判題等,下面以題目提交與判題為例進行描述。
題目提交實現(xiàn)過程中,將前端頁面分為題目描述與彈窗兩部分,這樣可以實現(xiàn)無須將頁面下拉到底端即可實現(xiàn)提交功能。該模塊中,選擇提交代碼語言時使用Select選擇器,用戶可在基于CodeMirror的代碼輸入框中輸入程序源代碼,通過相應(yīng)配置實現(xiàn)代碼高亮等功能,CodeMirror通過注冊該組件上的on-Change事件獲取用戶輸入的源代碼,代碼提交時通過Base64進行編碼,這樣可以減少在數(shù)據(jù)傳輸過程中可能出現(xiàn)的錯誤;在服務(wù)端,獲取/upProblem路徑上的post提交時采用SubmitCon-troller類中的方法,提交獲取后通過pid調(diào)用prisma.problem方法進行詳細信息的查詢,然后通過prisma. createSubmit創(chuàng)建一個用于提交的等待狀態(tài),并將信息發(fā)送給Judge服務(wù)器;Judge服務(wù)對接收到的信息進行解碼與編譯,然后將運行結(jié)果與正確答案進行比較,并將結(jié)果發(fā)送至SubmitController的updateProb-lem方法,該方法將所有測試產(chǎn)生的運行結(jié)果進行遍歷,得出最終運行結(jié)果,并將其寫入數(shù)據(jù)庫。
對題目進行評測時,源代碼編寫采用C++語言實現(xiàn),具體如下:首先調(diào)用parse_arguments函數(shù)對傳人的實際參數(shù)進行解析,然后在Compiler函數(shù)中創(chuàng)建子線程,從而實現(xiàn)對源代碼文件的編譯,最后執(zhí)行freopen0函數(shù),并重定向到stderr/stdout文件,將結(jié)果返回給Main函數(shù)。在Main函數(shù)中獲取Compiler函數(shù)的返回值,若該值為0則給出錯誤信息。當編譯過程結(jié)束后,對mate.Json中的文件列表進行遍歷,進行外部數(shù)據(jù)的讀取,在該過程中,輸入文件使用*.in,保存輸出結(jié)果使用temp/*.out文件,如果運行超時,則向相應(yīng)子進程發(fā)出信號,返回超時信息,如果運行正常,則對文件進行比較,判斷比較結(jié)果是否一致,一致則為通過,如果不一致則返回錯誤,然后將運行時間和內(nèi)存寫入result.j son文件,繼續(xù)執(zhí)行下一組數(shù)據(jù)。
4 結(jié)束語
本文在對現(xiàn)有系統(tǒng)與用戶需求進行分析的基礎(chǔ)上,設(shè)計實現(xiàn)了以基于Koa2的在線評測系統(tǒng),系統(tǒng)采用三層架構(gòu)模式進行開發(fā),主要采用Rect、PostgreSQL等技術(shù),實現(xiàn)了用戶分組管理、分角色權(quán)限管理、前端服務(wù)端開發(fā)分離、題目在線評測等功能,并在學生中進行測試,測試過程與結(jié)果表明:該系統(tǒng)界面友好、擴展性強,可以較好地滿足用戶的需求。
參考文獻:
[1]黃洪波.大規(guī)模編程題在線評判技術(shù)研究[D].廣州:華南農(nóng)業(yè)大學,2016:18-20.
[2]楊志偉,曾艷姍,基于Linux的ACM在線評測系統(tǒng)研究[J].計算機與現(xiàn)代化,2010(6):166-169.
[3]李博,孟成博.對HUSTOJ在線評測系統(tǒng)的若干優(yōu)化與創(chuàng)新[J].現(xiàn)代計算機:專業(yè)版,2013,(35):47-50,56.
[4]杜艷美.基于web前端的性能優(yōu)化框架模型研究[D].綿陽:西南科技大學,2018:9-11.
[5]蔡崇超.基于Web的在線判題系統(tǒng)設(shè)計與實現(xiàn)[J].軟件導刊,2016,15(3):107-109.
[6]王致遠,周威,陳義明.基于SSM的ACM虛擬判題系統(tǒng)的設(shè)計與實現(xiàn)[J].電腦知識與技術(shù),2018,14(9):95-97.