肖雙林 彭瑞琪 段明秀 田杰
摘要:通過分析程序設(shè)計(jì)類課程實(shí)踐教學(xué)的需求和特點(diǎn),在研究市場(chǎng)上現(xiàn)有在線評(píng)判系統(tǒng)使用技術(shù)和架構(gòu)的基礎(chǔ)之上,設(shè)計(jì)了一種符合教學(xué)需求、可自由切換多種模式、適用范圍更加廣泛的新型在線評(píng)判系統(tǒng)。系統(tǒng)成功運(yùn)用在教學(xué)和程序競(jìng)賽培訓(xùn)中。
關(guān)鍵詞:在線評(píng)測(cè);新型架構(gòu);技術(shù)體系;運(yùn)行流程
中圖分類號(hào):TP311 ? ? ?文獻(xiàn)標(biāo)識(shí)碼:A
文章編號(hào):1009-3044(2021)31-0095-02
Design and Implementation of a New Architecture of Online Judge System
XIAO Shuang-lin, PENG Rui-qi, DUAN Ming-xiu, TIAN Jie
(College of Information Science and Engineering, Jishou University, Jishou 416000, China)
Abstract: Based on the analysis of the requirements and characteristics of the practical teaching of program design courses and the study of the technology and structure of the existing Online Judge in the market, a new Online Judge is designed, which meets the needs of teaching and training, can switch freely between multiple modes and has a wider application range. The system has been successfully used in teaching and program contest training.
Key words: Online Judge; new architecture; technical system; running process
1 背景
程序設(shè)計(jì)能力是信息類專業(yè)學(xué)生需要熟練掌握的基本能力。特別是在國(guó)家大力發(fā)展人工智能、大數(shù)據(jù)及云計(jì)算的戰(zhàn)略背景下,各高校更加注重學(xué)生程序設(shè)計(jì)能力的培養(yǎng)。為此,各高校針對(duì)自己的培養(yǎng)目標(biāo)開設(shè)了相應(yīng)的程序設(shè)計(jì)課程,如C、C++、Java等。
早期,程序設(shè)計(jì)類課程大多注重對(duì)語(yǔ)法的教學(xué),實(shí)踐教學(xué)所占比重較輕。而且實(shí)踐教學(xué)通常由老師布置題目,學(xué)生編程實(shí)現(xiàn)后再提交給老師進(jìn)行人工評(píng)判[1]。這種方式不能及時(shí)反饋學(xué)生學(xué)習(xí)情況并且主觀性強(qiáng),很難真正提高學(xué)生的實(shí)踐能力,同時(shí)也增加了教師的工作強(qiáng)度。經(jīng)過多年的教學(xué)探索,許多高校開始實(shí)施以培養(yǎng)程序設(shè)計(jì)思想與方法為主,注重實(shí)踐能力培養(yǎng)的新型教學(xué)方法。近年來(lái),在線程序?qū)嵺`作為一種新穎的程序設(shè)計(jì)實(shí)踐形式逐漸被引入到程序設(shè)計(jì)類課程教學(xué)中[2-3]。學(xué)生通過使用在線評(píng)判系統(tǒng)完成教師布置的題目,并能夠及時(shí)在平臺(tái)上得到結(jié)果反饋,有利于教師實(shí)時(shí)掌握學(xué)生的學(xué)習(xí)狀態(tài)。
此外,隨著各類程序設(shè)計(jì)競(jìng)賽在高校的推廣,競(jìng)賽的規(guī)模和影響力越來(lái)越大。這些競(jìng)賽的出現(xiàn)不僅提高了學(xué)生的實(shí)踐能力,也給高校培養(yǎng)電子、信息專業(yè)人才提供了一種新的思路。因此,高校迫切需要一種適合教學(xué)和競(jìng)賽培訓(xùn)的新型在線評(píng)判系統(tǒng)[4]。
2 Online Judge系統(tǒng)現(xiàn)狀分析
目前,各賽事舉辦方和高校為滿足需求均設(shè)計(jì)了在線評(píng)判系統(tǒng)。南陽(yáng)理工學(xué)院、廈門大學(xué)等都設(shè)計(jì)了適合本校教學(xué)的在線評(píng)判系統(tǒng)。CodeForces、Oxcoder和Imagine Cup等程序設(shè)計(jì)競(jìng)賽舉辦方也陸續(xù)創(chuàng)建了相應(yīng)的競(jìng)賽判題系統(tǒng)。在線評(píng)判系統(tǒng)適用于教學(xué)練習(xí)還是競(jìng)賽培訓(xùn),不只由系統(tǒng)收錄題目決定,還要看系統(tǒng)架構(gòu)和評(píng)判模式。
1)常見的系統(tǒng)架構(gòu)有兩種:一種是C/S架構(gòu)是一種較早的軟件架構(gòu),主要用于區(qū)域網(wǎng)內(nèi),也叫客戶機(jī)/服務(wù)器模式。這種架構(gòu)的頁(yè)面和操作十分豐富,因其只有兩層傳輸,安全性能夠得到保證。但因使用這種架構(gòu)開發(fā)的系統(tǒng)需要安裝才能使用,導(dǎo)致用戶較為固定并且維護(hù)成本較高。這種系統(tǒng)使用戶不能在系統(tǒng)上獲知題目信息以及自己的代碼通過了多少個(gè)測(cè)試點(diǎn),只能知道自己的答案是否正確。另一種是B/S架構(gòu),這種架構(gòu)無(wú)需安裝相應(yīng)的App,極少部分事務(wù)邏輯在前端實(shí)現(xiàn),使得系統(tǒng)更加可靠。
2)目前有單數(shù)據(jù)測(cè)試用例、多數(shù)據(jù)測(cè)試用例、帶權(quán)重多數(shù)據(jù)測(cè)試用例三種評(píng)判模式。單數(shù)據(jù)測(cè)試用例模式要求每道題的測(cè)試數(shù)據(jù)存放在一個(gè)數(shù)據(jù)文件中,必須通過所有測(cè)試數(shù)據(jù)才被判對(duì),要求較為嚴(yán)苛。多數(shù)據(jù)測(cè)試用例模式要求每道題提供多個(gè)數(shù)據(jù)集,每個(gè)數(shù)據(jù)集存放在一個(gè)數(shù)據(jù)文件中,通過相應(yīng)的數(shù)據(jù)集就可得到對(duì)應(yīng)的分?jǐn)?shù),設(shè)計(jì)較為合理并且可以幫助學(xué)生找到解題思維上的漏洞。帶權(quán)重多數(shù)據(jù)測(cè)試用例模式要求根據(jù)題目難度高低對(duì)不同數(shù)據(jù)集分配不同權(quán)重,難度較低的題目數(shù)據(jù)集分配較低權(quán)重,系統(tǒng)分配較短時(shí)間去評(píng)判,從而合理安排不同題目的評(píng)判時(shí)間,提高判題效率。
3 系統(tǒng)的架構(gòu)設(shè)計(jì)
為解決目前市場(chǎng)上在線評(píng)判系統(tǒng)大多由一臺(tái)服務(wù)器完成所有任務(wù)而導(dǎo)致系統(tǒng)并發(fā)量不大的問題,本系統(tǒng)整體采用分布式架構(gòu)。數(shù)據(jù)庫(kù)、評(píng)判核心和web用戶界面分別部署到不同的服務(wù)器上[5]。同時(shí)為縮短系統(tǒng)的開發(fā)周期、減少開發(fā)難度,進(jìn)行異步設(shè)計(jì)與開發(fā)。系統(tǒng)的架構(gòu)如圖1所示:
前端頁(yè)面部分采用VUE框架,實(shí)現(xiàn)數(shù)據(jù)的雙向綁定,后端包括采用Spring-Boot框架實(shí)現(xiàn)的web服務(wù)器、任務(wù)調(diào)度服務(wù)器(分發(fā)任務(wù))、結(jié)果寫回服務(wù)器(保存結(jié)果)和使用C++實(shí)現(xiàn)的判題機(jī)。判題機(jī)與上位機(jī)之間使用boost庫(kù)實(shí)現(xiàn)同步連接[6],判題機(jī)與Web服務(wù)器之間使用Linux的網(wǎng)絡(luò)文件系統(tǒng)(NFS)進(jìn)行測(cè)試用例文件共享,使用strace跟蹤器監(jiān)控判題進(jìn)程安全。
4 系統(tǒng)的實(shí)現(xiàn)
4.1 系統(tǒng)技術(shù)體系
在web服務(wù)器中采用SpringSecurity來(lái)實(shí)現(xiàn)用戶認(rèn)證和權(quán)限控制。系統(tǒng)采用Nginx實(shí)現(xiàn)分布式部署,做到負(fù)載均衡,同時(shí)使得占有的內(nèi)存更少,并發(fā)能力更強(qiáng)。
前端使用AJAX技術(shù),通過異步方式加載數(shù)據(jù),并在頁(yè)面呈現(xiàn)出來(lái),在得到更快的前端響應(yīng)的同時(shí)減輕了服務(wù)器負(fù)荷[7]。由于AJAX請(qǐng)求的是json數(shù)據(jù)而不是html文檔,可以有效地減少網(wǎng)絡(luò)數(shù)據(jù)的傳輸量,節(jié)省網(wǎng)絡(luò)帶寬,提高用戶的操作體驗(yàn)。
4.2 系統(tǒng)運(yùn)行流程
用戶在做題界面提交代碼以JSON格式交由后端web中對(duì)應(yīng)的接口。接口在接收到相應(yīng)的數(shù)據(jù)后,先判斷該題目是否超過了規(guī)定的答題時(shí)間,如果在題目允許的時(shí)間內(nèi)則將前端提交的信息和題目信息包裝成“任務(wù)”保存到數(shù)據(jù)庫(kù)再下發(fā)給任務(wù)調(diào)度服務(wù)器。任務(wù)調(diào)度服務(wù)器接收到判題任務(wù)后,先將任務(wù)存儲(chǔ)到暫存內(nèi)存中,再根據(jù)判題機(jī)發(fā)送的任務(wù)申請(qǐng)信息、判題任務(wù)的權(quán)重和數(shù)量按照平均處理時(shí)間將任務(wù)發(fā)送到判題機(jī)。每臺(tái)判題機(jī)可以同時(shí)存儲(chǔ)和處理多個(gè)判題任務(wù)。在處理任務(wù)時(shí)服務(wù)器還會(huì)根據(jù)自身狀態(tài)動(dòng)態(tài)地向任務(wù)調(diào)度服務(wù)器發(fā)送任務(wù)申請(qǐng)信息,保證了判題效率的最大化。
判題機(jī)在接收到判題任務(wù)后,先將用戶提交的代碼本地化,再由判題機(jī)內(nèi)部的分發(fā)線程將判題任務(wù)分發(fā)到判題線程。判題線程在獲取任務(wù)后先將任務(wù)代碼復(fù)制到對(duì)應(yīng)的工作目錄中,再根據(jù)任務(wù)語(yǔ)言類型進(jìn)行編譯。編譯正確則取對(duì)應(yīng)題目的測(cè)試用例進(jìn)行運(yùn)行和答案比對(duì)[8]。
編譯時(shí)間不會(huì)算入任務(wù)的時(shí)間限制,且無(wú)論編譯是否正確都會(huì)將編譯信息重定向到標(biāo)準(zhǔn)輸入文件并保存在結(jié)果中。運(yùn)行過程會(huì)受到任務(wù)信息中時(shí)間、內(nèi)存、棧的限制和系統(tǒng)自定義的安全限制。根據(jù)代碼的運(yùn)行情況返回任務(wù)結(jié)果,主要包括運(yùn)行時(shí)間、運(yùn)行內(nèi)存和測(cè)試點(diǎn)結(jié)果。在答案比對(duì)后,判題線程會(huì)將所有測(cè)試用例的結(jié)果收集并組裝成一個(gè)任務(wù)結(jié)果存儲(chǔ)到對(duì)應(yīng)的存儲(chǔ)隊(duì)列,再由判題收集線程將結(jié)果發(fā)送給結(jié)果寫回服務(wù)器。
結(jié)果寫回服務(wù)器接收到任務(wù)結(jié)果信息后,將信息寫入數(shù)據(jù)庫(kù),并返回確認(rèn)存儲(chǔ)信息給任務(wù)調(diào)度服務(wù)器,確保每個(gè)判題任務(wù)不會(huì)丟失。之后,web端可以根據(jù)任務(wù)流水號(hào)在數(shù)據(jù)庫(kù)中查詢?nèi)蝿?wù)結(jié)果信息并將其組裝返回前端頁(yè)面進(jìn)行渲染和顯示。
4.3 系統(tǒng)優(yōu)點(diǎn)
本系統(tǒng)的web層分層設(shè)計(jì)使得不同任務(wù)會(huì)有相應(yīng)的處理流程。普通業(yè)務(wù)只需在web層就可進(jìn)行業(yè)務(wù)處理。而判題任務(wù)則由web層下發(fā)到任務(wù)調(diào)度服務(wù)器,任務(wù)調(diào)度服務(wù)器再將判題任務(wù)分發(fā)到多個(gè)判題機(jī),判題機(jī)處理后得到的結(jié)果再轉(zhuǎn)發(fā)給寫回服務(wù)器,進(jìn)行數(shù)據(jù)持久化。
這樣做使本該由web層實(shí)現(xiàn)的分發(fā)和并發(fā)轉(zhuǎn)移到了任務(wù)調(diào)度服務(wù)器上,減輕了web服務(wù)器的壓力并解決了容災(zāi)。使得web服務(wù)器對(duì)結(jié)果的讀取、結(jié)果寫回服務(wù)器對(duì)結(jié)果的寫入分離以及任務(wù)調(diào)度服務(wù)器任務(wù)分發(fā)這三個(gè)任務(wù)實(shí)現(xiàn)了負(fù)載均衡。
web服務(wù)器和判題機(jī)進(jìn)行NFS連接使測(cè)試用例可以在每臺(tái)判題機(jī)同步、使網(wǎng)絡(luò)的壓力減少(因?yàn)闇y(cè)試用例文件很大,通過網(wǎng)絡(luò)層傳遞耗費(fèi)大量時(shí)間,也使其他任務(wù)無(wú)法進(jìn)行)。
目前,大多數(shù)的在線評(píng)判系統(tǒng)大多只有一個(gè)服務(wù)器來(lái)執(zhí)行多項(xiàng)任務(wù)使得整個(gè)系統(tǒng)的承載數(shù)量有限并極易崩潰。本系統(tǒng)高并發(fā)、分布式設(shè)計(jì)將任務(wù)合理有效地分離執(zhí)行,同時(shí)為數(shù)目可觀的用戶提供穩(wěn)定的在線服務(wù)。
5 結(jié)束語(yǔ)
本系統(tǒng)不同于市場(chǎng)上現(xiàn)有的OJ系統(tǒng),整體采用分布式架構(gòu),擁有多個(gè)服務(wù)器,并發(fā)量更高,系統(tǒng)運(yùn)行更加穩(wěn)定。系統(tǒng)為學(xué)生的實(shí)踐培養(yǎng)提供一個(gè)良好的平臺(tái),可以有效地提升教學(xué)質(zhì)量[9]。
參考文獻(xiàn):
[1] 王桂平,劉君,羅憲,等.一個(gè)基于多種評(píng)判模式的在線評(píng)判系統(tǒng)[J].計(jì)算機(jī)科學(xué),2020,47(S2):657-661.
[2] 王桂平,馮睿.突出實(shí)踐能力培養(yǎng)的程序設(shè)計(jì)課程教學(xué)方法[J].實(shí)驗(yàn)室科學(xué),2009,12(1):81-84.
[3] Wang G P,Chen S Y,Yang X,et al.OJPOT:online judge & practice oriented teaching idea in programming courses[J].European Journal of Engineering Education,2016,41(3):304-319.
[4] 蔡崇超.基于Web的在線判題系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)[J].軟件導(dǎo)刊,2016,15(3):107-109.
[5] 黃曉華,沈健,常晉義,等.基于Online Judge與HTML批注技術(shù)的實(shí)驗(yàn)教學(xué)平臺(tái)設(shè)計(jì)[J].計(jì)算機(jī)與現(xiàn)代化,2014(11):117-121.
[6] 黃金春,杜娟嬌.超小型在線評(píng)測(cè)系統(tǒng)的設(shè)計(jì)與實(shí)現(xiàn)[J].現(xiàn)代計(jì)算機(jī)(專業(yè)版),2018(13):83-86.
[7] 莊奇東,王鍵聞,張楠,等.Online Judge系統(tǒng)的優(yōu)化[J].計(jì)算機(jī)系統(tǒng)應(yīng)用,2011,20(8):115-121.
[8] 鐘耀章,桂瓊.ACM競(jìng)賽在線測(cè)評(píng)系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)[J].無(wú)線互聯(lián)科技,2020,17(18):42-44.
[9] 黃龍軍,范立新.面向Online Judge的查詢方法及其實(shí)現(xiàn)[J].計(jì)算機(jī)系統(tǒng)應(yīng)用,2013,22(8):79-82.
【通聯(lián)編輯:謝媛媛】
收稿日期:2021-06-20
基金項(xiàng)目:湖南省大學(xué)生創(chuàng)新創(chuàng)業(yè)項(xiàng)目(項(xiàng)目編號(hào):湘教通[2020]191號(hào))
作者簡(jiǎn)介:段明秀(1975—),女,湖南茶陵人,副教授,碩士,主要從事數(shù)據(jù)挖掘和人工智能研究。