当前位置:天海范文网 > 教案设计 >

一种分布式Online,Judge系统设计与实现

时间:2023-09-15 13:08:02 来源:网友投稿

曾 金,彭 玲,毛志斌,张耀峰

(1.湖北经济学院 信息管理学院;
2.武汉大学 信息管理学院,湖北 武汉 430072;
3.湖北经济学院 中国改革试点探索与评估协同创新中心湖北分中心,湖北 武汉 430205)

教育部针对新工科、新文科建设提出新的评估方法,要求高等教育的整个教学环节要以数字化和虚拟化教学为目的,从而驱动整个教学活动和成果评价的新要求[1]。同时,随着时代和科技发展,个人计算机已得到全面普及。伴随着高级语言的出现与流行,计算机编程逐渐成为高校计算机科学与技术、大数据、人工智能、物联网等专业的核心课程,并且这些专业都离不开上机编程[2]。在计算机编程类课程中,数据结构与算法课程必不可少,任何计算机程序都是基于数据结构和算法基础编写而成。目前,大多数高校计算机专业中,课堂教学偏重于理论,在算法代码实现上训练不足,导致多数学生在平时上机课或期末卷面考试中能考出较好成绩,但在算法复现及应用上极为困难。在传统实验课上,学生在课上完成算法代码后,教师逐一阅读代码、运行验证代码、调试代码颇为不便,卷面考试也很难检验学生实际编程能力。因此,设计在线评测系统平台是学科交叉融合改革的新探索,可极大程度地解决上述问题。判题服务器可以自动完成所有学生代码的运行评测,可极大减轻教师负担,并提供数据反馈,让教师更有针对性地开展教学。因此,在计算机、大数据及人工智能专业学生培养中,可供在线使用的编程答题系统必不可少。设计一款好的Online Judge 系统,不仅可以解决传统评分过程中存在的不公平问题[3],还可以解决教育部对教学成果评估的需求。互联网企业招聘中,算法考核是求职者在面试中的重要考核因素。该系统可模拟企业对招聘者知识掌握程度进行分析,有针对性地加强学生、求职者和在职人员对数据结构和算法的实践应用,促使其迅速提升编程能力[4-5]。

在线程序测评系统最早可追述到1960年,是计算机辅助教学系统中的一个分支[6]。随着计算机技术的进步和互联网技术的发展,该系统在功能和应用规模上均取得巨大进步。

目前,国内外有许多在线代码评测平台,主要分为两类。一类主要是面向高校自主搭建的Online Judge 系统,例如北京大学的POJ[7]、浙江大学的ZOJ[8]、哈尔滨工业大学的HITOJ[9]等。此类Online Judge 的优点在于高校教师可自主发布各类考试、比赛,资源丰富、题库优质、灵活性好,能够针对特定算法基础模块对学生所学知识进行巩固和测验。另一类是专门面向社会的大型公众Online Judge平台,例如LeetCode、UVA、CodeVS 等国内外大型Online Judge 平台,其优点在于目标性强、专门针对企业招聘考试、较多算法题目,因而比较适合经验丰富的编程者[10]。无论是面向高校类的Online Judge 系统,还是面向社会的大型公众Online Judge 平台,均存在以下问题:

(1)传统Online Judge系统开发存在稳定性及开发文档维护性不足等问题[11]。随着计算机的普及,大量软件及应用数据产生,硬件发展速度跟不上软件性能,由此产生非常严重的问题,即规模大、复杂性高、容错能力差的软件稳定性差,没有系统的开发文档导致维护难度非常大,传统语言开发已无法满足当下需求,这也是软件危机的起源。

(2)开发语言存在跨平台及效率低的缺陷[12]。分布式Online Judge 系统实现需要开源跨平台面向对象的编程语言,这种语言具有非常丰富的扩展性,拥有良好的社区环境,使开发者们愿意贡献出自己的源代码。在使用过程中,可以借助功能强大的自带库和社区丰富的第三方库,以最快的速度实现开发者想要实现的功能。由于开发环境语言友好且简洁、易读,用来解决一些简单重复的工作可极大提升工作效率。

(3)服务器稳定性及安全性不足[13]。Online Judge 系统最核心的部分在于判题节点的规划与实现,在服务器端评测用户提交的代码,会极大地影响后端服务器的稳定性。虽然已经采用分布式架构完成Online Judge 系统,但学生提交的代码受硬件环境限制,需采用容器技术作为Judge Node 节点的核心技术实现。容器可以打包应用及所需要的依赖,在任意版本的Linux 和Windows 平台上完成部署,极大地提高了程序稳定性。此外,容器技术实现的沙盒隔离,可以防止常见Online Judge 系统被攻击,例如在c/cpp 语言中使用include 造成服务器密码或数据库密码外泄,在评测机进行程序编译时被攻击代码卡死造成服务宕机。因此,使用好容器不仅可以保护服务器端的安全隐私,也可以在Judge 节点宕机时重新自动拉取镜像,不会造成服务器判题节点效率降低。

(4)个性可视化分析有待提高[14]。目前,大部分Online Judge 系统在判题功能上较为完善和强大,但在用户个性可视化功能展示上有待进一步提高,如对用户编程能力的评估、强项与弱项的具体评估指标、时序评估体系可视化展示等,不能深层次挖掘用户编程能力不足的原因并提供相应的改进建议。

自主研发的分布式Online Judge 系统不仅可以为学生提供巩固基本数据结构知识和提升算法编程思维能力的平台,供教师发布课堂作业、考试任务,并对学生进行测试,还可用于学院举办编程比赛、选拔优秀学员从而代表学校参加各类学科竞赛,如ACM(美国计算机协会)/ICPC(国际大学生程序设计竞赛)、蓝桥杯、百度之星等赛事[15-16]。

该Online Judge 系统的优势在于利用Python 语言和Django 的特性,将数据库与管理员后端结合起来,具有较强的容错能力和稳定性,方便后期维护,且可以跨平台安装使用;
该系统还可以随时调用功能强大的第三方库以支持和弥补系统开发过程中存在的不足和缺陷,以最快的速度实现开发者想要实现的所有功能。该系统的创新之处在于其具有强大的数据可视化功能和测评体系,可对用户编程能力进行实时的可视化分析和评价,并总结用户评测不足,从而帮助用户提高编程能力。

2.1 系统简介与运行环境

Online Judge 是一个在线代码评测系统,其基于预先设定好的测试用例,对用户提交的代码进行编译测试,并在测试结束后将数据返回给前端页面,给用户以直观的体验。Online Judge 系统可以帮助用户巩固数据结构基础,提高算法能力及时间、空间决策能力,还可为用户参加编程比赛或作业测试提供练习平台[17]。

文本分布式Online Judge 系统的开发运行环境如表1所示,系统运行环境交互如图1所示。

Table 1 Development and operation environment表1 开发运行环境

Fig.1 Interaction of distributed Online Judge system operating environment图1 分布式Online Judge系统运行环境交互

2.2 系统架构与功能模块设计

该分布式Online Judge 系统架构主要分为4 个板块:前端交互页面、调度服务器端节点、端判题节点、数据存储节点。用户只需在前端页面上提交评测代码,Django 就会将前端数据写入数据库,并将代码传到后端调度节点,后端任务调度会将代码加入评测队列,完成评测后更新数据库评测状态。分布式Online Judge 系统架构如图2所示。

Fig.2 Architecture of distributed Online Judge system图2 分布式Online Judge系统架构

该系统基于B/S 架构,管理员、学生、教师可通过计算机或其他移动设备进行操作,系统功能模块设计让如图3所示。

通过对不同Online Judge 平台进行分析,本文根据实际需求及应用场景,主要实现Online Judge 系统以下功能模块:

Fig.3 Design of distributed Online Judge function module图3 分布式Online Judge功能模块设计

(1)用户注册。主要验证用户是否为本校学生,对接学校教务系统登录数据库,使用登录爬虫将用户学号及密码与学校教务系统进行对接验证,验证成功后,将用户信息写入本系统用户数据库。

(2)用户登陆。通过Cookies 技术,保持用户登陆状态,只有在登陆状态下,才能访问试题列表、提交评测代码等操作。

(3)试题系统。通过预先设定的密码进入,指定或随机形成试题集合,用于课堂任务、期末考试、比赛选拔人员等场景。

(4)公告系统。发布公告,所有人员可查看,发布口位于管理员后台。

(5)管理员后台。Django[18]是基于Python,可非常快速、简单地进行开发,仅需少量代码即可完成网站的简单架构。Django 基于MVC 模型,即Model 模板、View 视图及Controller 控制器组成的设计模式[19]。MVC 模式可简化后续对程序的修改和扩展,并可使某部分程序重复利用,极大提升开发效率。通过对Django Admin 后台进行二次开发,使管理员能够在后台快速操作数据库,即发布公告、增删试题数据、查看用户提交数据等操作,方便后期管理员操作,提高系统可维护性。Django MVC 模型如图4所示。

(6)任务调度器。使用服务器作为任务调度器,用TCP 协议监听1102 端口,当Django 服务端将用户评测数据发往次端口时,自动判断评测类型,并转发到相应的Docker评测机[20-21]。

Fig.4 Django MVC model图4 Django MVC模型

(7)评测机。当Docker 沙盒里的评测机接收到判题请求时,自动识别题目序列号,并调用对应测试集进行限定时间、限定内存的评测,并更新评测结果到数据库[22]。

3.1 系统简介与运行环境

分布式Online Judge 系统功能实现需要后端数据存储功能,故本次开发所采用的数据库为Mysql 5.6 Linux x86 64位版本。

设计数据表需考虑整个系统功能,综合考虑后构建多个数据表结构。在设计表时需考虑以下特性:①原始性:基本表中所有数据均为数据源创建时的原始数据;
②演绎性:基本数据表可以进行多种组合,满足系统各场景需求;
③稳定性:表的结构稳定,在系统设计完毕后,保持表结构不被轻易更改;
④原子性:表结构中的所有字段均无法再细分。

3.2 数据库表设计

基于设计库的特性及分布式Online Judge 系统的应用场景,系统数据设计结构主要分为以下5 张数据表:User-Info(用户信息表)、(NoticeModel)通知公告表、ProblemSet-Model(试题信息表)、TestModel(比赛信息表)、CommitData(判题数据表)。数据库结构如图5所示。

Fig.5 Database structure图5 数据库结构

4.1 用户注册

该分布式Online Judge 系统对非登录用户限制查看部分页面,若要完整体验整个系统,则需进行注册。为保持信息安全,用户注册功能对接了本校教务系统,从而只对本校学生开放。

4.2 用户登陆

为更好地服务学校,该系统通过爬虫技术登录学校教务系统,通过对学校教务系统登陆模块的网络抓包日志进行分析,发现学校教务系统的登陆认证方式为非对称公私钥登录。登录方式向登录认证服务器申请公钥,将申请到的公钥信息解码(信息为Base64 编码加密);
对获取到的参数信息与账户密码共同进行Base64 加密,生成服务器所需密码;
用生成的高级加密标准密钥(Advanced Encryption Standard,AES)[23]向服务器发起登陆请求,并保存登录的Cookies 文件,保持登录状态。

AES 非对称加密算法是目前最具影响力的算法,其基本原理为[24]:

(1)密钥生成。在安全参数n上,生成公钥(N,e)和密钥(N,d),使得N=p*q,p、q素数长度为n,e互质φ(n)=(p-1)(q-1)和d=[e-1modφ(N)];

(2)加密。给定消息m∈Z*N,加密(N,e)(m):=[memodN];

(3)解密。给定密文c∈Z*N,解密(N,d)(c):=[cdmodN]。

从登录到密钥生成,再到整个加密和解密过程的核心代码如图6所示。

Fig.6 Login encryption module decryption module core code图6 登录加密模解密模块核心代码

4.3 用户代码提交

用户在前端页面完成对应题目后,可通过前端页面提交编写的代码,前端页面收到提交代码事件后,会异步将用户代码交给Django 视图层进行处理。该系统视图层处理方式为:将数据保存到数据库,根据用户姓名、提交题目ID、提交时间用md5 生成唯一主键,即任务队列的ID,Django 视图层将任务队列ID 传给后端调度节点进行判题调度,判题节点根据队列ID 取出数据库中用户提交的代码,并进行评测,评测完成后,刷新数据库评测状态,从而实现代码提交功能。

4.4 后端判题节点

该分布式Online Judge 系统后端判题节点采用一对多的方式实现后端判题功能集群。随着算力增大,通过分布式计算可实现在多台服务器上平衡负载,提高计算效率。在实验中,使用1 台调度服务器和3 台判题节点服务器,其中,调度服务使用轮询调度算法。轮询算法的主要实现原理是将前端用户发来的判题服务请求由调度服务器轮流分配给多台判题服务器,从1 到N(判题服务器个数),然后重新开始循环。由于调度服务器不用实现计算功能,故可快速完成任务调度分配,而判题节点服务器只需完成相应判题响应服务即可。由于多判题服务节点存在,即使某个判题节点宕机,也不影响整个服务运行。调度服务器由Nginx 框架实现,判题服务节点使用DOCKER 容器,将服务端口开放给调度服务器,构建路由映射表,实现调度服务功能。

后端判题节点由两部分组成:任务调度模块和评测模块。任务调度模块的主要任务是监听TCP 端口(该系统使用1102 端口),由于Django 会将CommitID 通过TCP 协议发送数据给调度服务器,因而此模块的Python 实现为监听事件,判题节点通过Python 的unittest 库实现,该库可以实现代码的自动化测试并生成测试报告

4.5 管理员后台

为方便后续公告发布、试题增删、比赛创建等操作,该系统还增加了管理员后台页面,管理员可通过预留的/admin 页面进行管理员后台登录,登录成功后可对整个系统数据进行增删改查操作,适用于没有网站维护经验的管理人员。

4.6 答题数据结果可视化

大多传统判题系统仅有简单的统计可视化功能,且均为基于静态数据的可视化展示,并不具备深度分析的能力。该分布式Online Judge 系统除可视化功能强大外,还可实现动态及增量数据更新。数据可视化主要采用Echarts,使用多容器承载、Grid 组件及ajax 实时刷新,所有数据均从Mysql 数据库中获取。系统凭借良好的交互性,通过直接集成Echarts第三方开源数据可视化工具,更为快捷地将系统内数据生成直观生动、可交互、可个性化定制的数据可视化图表,赋予学生、教师或管理员对数据进行分析整合的能力。

学生测评成绩可视化功能展示将测评成绩排名进行可视化呈现,可按班级、系、院、校分别排名。学生可通过条形图看到每次测评的排名结果,学生个人测评班级排名可视化界面如图7所示。

Fig.7 Student personal evaluation ranking图7 学生个人测评排名

通过折线图可详细看到学生某季度测评均值,该结果自动汇总,生成个人成长曲线。学生个人测评结果分数汇总页面如图8所示。

Fig.8 Summary page of student personal evaluation score图8 学生个人测评结果分数汇总页面

教师和管理员通过后台界面可以看到综合测评结果维度可视化页面展示,用来分析题型测评的不足。可视化雷达图和柱状图主要从图论、数论与组合数学、数据结构、动态规划搜索、计算几何、算法基础6 个维度构建测评指标,从而分析年级排名和班级排名,从不同维度获得排名结果。该可视化页面可以从年级和班级2 个维度进行对比,得出学生在解题中薄弱的知识点,有针对性地在课堂上讲解相关知识点。综合测评结果雷达图和柱状图可视化页面如图9、图10所示。

Fig.9 Radar chart visualization page of comprehensive evaluation result图9 综合测评结果雷达图可视化页面

Fig.10 Histogram visualization page of comprehensive evaluation result图10 综合测评结果柱状图可视化页面

本文提出的系统使用Python3.6 作为主要开发语言、Django Rest Framework 作为后端框架、Centos7 系统作为OJ的服务环境,采用Bootstrap 完成前端页面设计、Docker 容器技术完成沙盒隔离,并作为评测机的运行环境。考虑到性能问题,该系统使用分布式架构以确保整个系统的安全性、高效性和稳定性。在数据分析和可视化方面,该系统构建种较为独特的评测体系,并能够生成简版个人成绩测评分析报告。

同时,该系统也存在一些不足,主要有3 点:①系统尚不能生成班级测评成绩详细分析报告功能页面;
②各项测评指标体系构建需进一步细化,如:一级测评指标和二级测评指标科学构建方法探索;
③该系统最终可视化的本质是希望借助大数据思想实现预测趋势的功能。因此,后续将进一步完善该系统各班级测评成绩分析报告和各项测评指标体系构建,如一级测评指标体系维度(图论、数论与组合数学、数据结构、动态规划搜索、计算几何、算法基础),二级测评指标体系维度(测评效率、测评题型复杂度、测评能力、测评方法等),更加深入地挖掘和分析数据可视化功能模块,完善其预测功能。

猜你喜欢评测代码页面刷新生活的页面保健医苑(2022年1期)2022-08-30次时代主机微软XSX全方位评测(下)家庭影院技术(2021年2期)2021-03-29次时代主机微软XSX全方位评测(上)家庭影院技术(2021年1期)2021-03-19攻坡新利器,TOKEN VENTOUS评测中国自行车(2018年11期)2018-12-03创世代码动漫星空(2018年11期)2018-10-26创世代码动漫星空(2018年2期)2018-10-26创世代码动漫星空(2018年9期)2018-10-26创世代码动漫星空(2018年5期)2018-10-26Canyon Ultimate CF SLX 8.0 DI2评测中国自行车(2017年1期)2017-04-16Web安全问答(3)通信技术(2012年4期)2012-02-15

推荐访问:分布式 设计 系统

版权所有:天海范文网 2010-2024 未经授权禁止复制或建立镜像[天海范文网]所有资源完全免费共享

Powered by 天海范文网 © All Rights Reserved.。鲁ICP备10209932号