基于微服务+沙箱技术的自动判题系统的设计与实现

known 发布于 2025-08-25 阅读(203)

摘" 要:在在线教育需求不断增长的背景下,传统的人工评测编程题方法存在效率低下等问题,因此开发编程题自动判题系统至关重要。文章设计和实现了基于Spring Cloud的编程题自动评分系统。首先,进行了总体功能、主要系统模块及数据库设计;其次,设计并实现了用户服务、题目服务、评分服务、代码沙箱服务以及其他公共模块的多个微服务;最后,为解决高并发下系统评分速度较慢的问题,采用了RabbitMQ消息队列实现异步评分功能。该系统提供了友好的界面和操作流程,方便用户在线作答。系统在评分的准确性、高效性和稳定性方面具有一定优势,提高了评分效率,减少了人力资源消耗,有显著的实用价值和广泛的应用前景。

关键词:微服务;自动判题;沙箱;Spring Cloud;RabbitMQ

中图分类号:TP311.1" 文献标识码:A" 文章编号:2096-4706(2024)19-0091-06

Design and Implementation of an Automatic Question Judging System Based on Microservice + Sandbox Technology

LIU Mei, TANG Ming, LI Zhengfeng

(Communication University of China Nanjing, Nanjing" 211172, China)

Abstract: Under the background of the continuous growth in the demand for online education, the traditional manual evaluation methods for programming questions exist low efficiency and other issues, thereby developing an automatic programming question judging system is essential. This paper designs and implements an automatic programming question grading system based on the Spring Cloud. Firstly, it designs overall functions, main system modules and database. Secondly, multiple microservices including user service, question service, grading service, code sandbox service, and other common modules are designed and implemented. Finally, to address the issue of slow system grading speed under high concurrency, RabbitMQ message queue is utilized to implement asynchronous grading function. The system provides users with a user-friendly interface and operational flow, facilitating online answering. With the advantages in grading accuracy, efficiency and stability, the system enhances grading efficiency, reduces human resource consumption, and has significant practical value and broad application prospects.

Keywords: microservice; auto judge; sandbox; Spring Cloud; RabbitMQ

0" 引" 言

随着互联网技术的不断进步和在线教育用户规模的迅速增长,自动判题系统成为在线教育体系的重要组成部分,在提升编程教学质量和激励学生提高编程能力方面发挥着重要作用[1]。通过自动判题系统,教师能够更有效地评估学生的编程能力,为个性化教学提供支持;学生则可以获得及时准确的反馈,激发学习动力,提升学习效果。因此,研究一款自动判题系统,对于推动教育信息化发展,以及提升编程教学质量具有重要意义。

在在线教育用户数量持续增长、评测需求变得更加多元化的背景下,传统人工判题方法所存在的扩展性差、维护难度大和效率低等弊端日益凸显。与此同时,近年来,微服务框架技术开始应用于自动判题系统[2]的研发中。

为更加从容地应对大量的用户访问和数据处理的挑战,本文设计了一款基于微服务+分布式技术的编程自动判题系统。

1" 相关技术

1.1" 微服务框架

微服务最早由Martin Fowler与James Lewis于2014年共同提出。微服务是一种软件架构,指应用程序被构建为一组小型的独立服务,每个服务运行在自己的进程中,通过轻量级的通信机制(如HTTP或消息队列)与其他服务进行交互。该架构使开发人员能够根据业务需求独立开发、测试和部署每个服务,增强了系统的灵活性、可伸缩性、可维护性、可测试性和容错性,同时降低了开发和部署的复杂性[3]。微服务支持敏捷开发和持续交付,适用于大型复杂的应用程序。目前流行的微服务框架包括Spring Boot、Dubbo、Consul等。

1.2" Spring Cloud框架

Spring Cloud是基于Spring Boot开发的一款旨在简化分布式系统的开发流程的框架。Spring Cloud提供了一套综合性的工具和组件,包括服务发现、配置管理、负载均衡和API网关等,利用Spring Boot开发人员能够更加便捷地创建、部署并管理微服务项目[4]。已广泛应用于电子商城系统[5]、融合媒体平台[6]、医疗数据平台[7]。

1.3" RabbitMQ消息队列

RabbitMQ[8]是一款基于高级消息队列协议(Advanced Message Queuing Protocol, AMQP)的开源分布式消息中间件。AMQP是一种用于规定消息中间件系统所使用的应用层通信协议,能够确保不同消息中间件产品之间的互操作性。RabbitMQ利用消息队列的方式实现了生产者与消费者之间的解耦,为消息传递建立了可靠的机制,且具备在云环境、本地计算机上易于部署等特点,已被广泛使用。

1.4" Docker容器

Docker是一个开源的容器化平台,用于快速构建、打包、部署和运行应用程序。Docker的核心思想是利用容器技术,将应用程序和其依赖项打包成一个独立、可移植的容器,实现快速部署和跨平台运行[9]。因其具备可移植性强、易于扩展和管理、提高开发效率等有点,被广泛应用于软件开发、测试、部署等方面。

1.5" 代码沙箱

在计算机领域,沙箱技术(Sandboxing)是一种用于隔离正在运行程序的安全机制,以限制不可信进程或不可信代码的访问权限。其工作原理是为待执行的程序提供一个虚拟环境,在该环境中包含虚拟的硬件和软件资源,如文件系统、网络和操作系统,使应用程序或进程可以在其中运行,且在沙箱中运行的程序只能访问沙箱为其加载的资源,而不会影响到外部的应用、系统或平台,从而避免对计算机中其他程序或数据造成永久更改。目前,沙箱主要分为语言级别的沙箱、应用程序级别的沙箱、操作系统级别的沙箱、硬件级别的沙箱等类型[10]。语言级别的沙箱技术能够有效隔离不信任的代码,并在运行时对其进行监控,避免潜在的安全风险。该技术可以有效地确保代码执行过程中不会对系统造成损害或泄露敏感信息,为系统提供额外的安全保障。

2" 自动判题系统设计

2.1" 需求分析

根据业务场景及功能进行系统需求分析,平台的用户角色分为:普通用户(学生)和管理员用户(教师)。按照系统功能可分为:

1)在自动判题系统中,管理员用户对普通用户的个人资料,包括修改、删除和更改权限等操作。普通用户则可以进行注册和登录。

2)题目管理模块。管理员可以发布新的编程题目,包括题目名称、题目内容、输入输出用例等,可以对题目信息进行修改。

3)判题模块。判题模块除了判题功能外,需向用户提供详细的评测结果,包括判题结果、错误信息、执行用时、执行状态等。

2.2" 总体功能设计

系统的主要功能模块包含:用户管理模块、题目管理模块、判题模块、代码沙箱模块。系统功能图如图1所示。

2.3" 系统架构

系统整体架构分为两个核心部分:系统功能布局和软件技术架构。首先,在系统用户需求分析的基础上,将总体需求拆分为多个子组件和微服务,并精心设计功能模块的结构、数据交互和存储方式。前端部分采用Element-UI进行图形界面设计,利用Vue.js实现动态场景交互,并通过Echarts对故障进行统计可视化展示。后端采用Spring Cloud+RabbitMQ+Nacos+Open Feign+MySQL技术架构,其中Spring Cloud作为微服务框架,Nacos作为服务发现与配置中心,简化了服务管理和配置更新流程。Open Feign用于服务间API接口的声明式调用,实现了服务间通信和协同工作。同时,利用MySQL作为数据库,实现数据的持久化存储和管理。通过RabbitMQ消息队列中间件实现代码沙箱服务与判题服务的解耦,支持判题实现异步操作,确保系统高性能和高可用性,以有效处理大规模并发判题请求。系统总体设计图如图2所示。

该系统技术瓶颈为代码沙箱功能和判题功能。为防止判题服务因为代码沙箱的压力过大而阻塞,影响核心业务的运行,同时为实现模块解耦,采用微服务架构对系统进行拆分,将较重的服务和核心业务分离解耦。系统拆分用户服务、判题服务、题目服务、代码沙箱服务、公共模块以及网关服务。

2.4" 代码沙箱设计

代码沙箱的主要功能在于为代码执行提供独立的运行环境,以确保安全性。该模块负责接受代码和输入数据,然后返回编译运行的结果,不参与具体的判题过程。代码沙箱作为独立的服务,供其他需要执行代码的项目使用。为了防止用户提交恶意代码导致过多资源消耗,代码沙箱采用Java安全管理器来限制资源和操作,同时使用Docker容器来部署代码沙箱,进一步增强系统的安全性。判题模块和代码沙箱模块流程如图3所示。

2.5" 判题模块设计

在线做题并提交代码后,业务层需查询题目信息并将判题任务提交至消息队列,并同时写入数据库。判题服务将调用代码沙箱编译和执行用户提交的代码,并将执行结果与预设的输入输出用例进行比对,以确定结果是否符合预期。最终,判题服务将更新数据库中的判题信息,并将评测结果反馈给用户。

3" 功能实现

系统前端基于Vue框架进行开发,后端采用SpringMVC架构进行分层设计。用户可以通过浏览器访问服务器内置的应用程序,服务器按照顺序调用相应的接口进行数据交互和处理。

3.1" pom配置

为了解决项目中的依赖和构建工作,使用Maven进行管理。对于不同的功能,需要对相应的pom.xml文件进行配置。以网关服务为例,其关键配置如下:

lt;dependencygt;

lt;groupIdgt;org.springframework.cloud

lt;/groupIdgt;

lt;artifactIdgt;spring-cloud-starter-gateway

lt;/artifactIdgt;

lt;/dependencygt;

此外,Springboot集成RabbitMQ,需要在pom中配置spring-boot-starter-amqp依赖。对于Nacos注册中心获取服务调用地址以实现远程调用,需要在pom.xml文件中配置Nacos的依赖。

3.2" 代码层

项目代码主要分为视图层、接入层、逻辑层和持久化层。具体如下:

1)视图层。用户操作的界面,基于Vue完成相应的页面开发。此外,做题页面,整合了Markdown编辑器和代码编辑器,使得用户可以在线编辑代码,同时页面也更加美观。

2)表现层。主要职责是接收用户在前端界面发起的请求,并执行相应的逻辑接口调用。

3)业务逻辑层。主要负责处理核心业务逻辑,并具备调用外部服务接口的能力。

4)数据持久化层。采用MyBatis框架进行数据库的读取和写入操作。

3.3" 判题功能实现

判题服务是系统的核心功能,用户在线做题并提交代码后,前端页面将数据传回QuestionController,业务层根据传入题目的提交ID,获取到对应的题目、提交信息,向RabbitMQ消息队列发消息。判题服务从消息队列中取出消息,调用沙箱,获取到执行结果。根据沙箱的执行结果,对比预设输入输出用例进行判题,异步更新数据库,将测评结果返回前端。该模块时序如图4所示。

由图4可知,判题服务与消息队列之间采用异步通信方式,实现了解耦性、协同工作,以及提升系统的性能、可靠性和可扩展性。通过消息队列,判题服务模块能够更高效地实现消息传递、处理和分发,从而确保系统能够处理大量并发请求。此外,消息队列还赋予了系统负载均衡和水平扩展的能力,使其能更好地适应不断增长的用户需求和系统压力。

3.4" 代码沙箱实现

代码沙箱作为自动判题系统最重要的一个模块,负责为用户提交的代码提供一个安全的运行环境,只负责接受代码和输入,执行返回编译运行的结果,不负责判题。以Java试题为例,主要步骤为:

1)将提交的答案写入文件(.java文件)。

2)使用javac-encoding命令编译成.class文件。

3)将.class文件上传至Docker容器环境,在Docker容器中执行代码。

4)运行所有的测试用例。

5)获取所有测试用例的结果并存入数据库。

6)删除.java文件。

7)将执行结果返回给评判服务。

代码沙箱实现中第三步,利用Docker容器技术,将Java程序与宿主机进行隔离,确保由Docker容器负责运行Java程序,避免对系统本身造成影响。进一步分解,在Docker容器中执行Java代码的具体步骤如下:

1)拉取镜像。使用DockerClient类的方法从Docker仓库中拉取包含Java运行环境的镜像。

2)创建容器。通过DockerClient类的功能创建一个新的容器实例,基于所选择的镜像,并设置相应的运行环境。

3)查看状态、执行Java代码并返回结果。使用DockerClient类提供的方法查看容器的状态,然后执行Java代码。可以通过执行命令、发送请求等方式,在容器内运行Java程序,并获取执行结果。

4)停止容器。在Java代码执行完成之后,使用DockerClient类停止正在运行的容器,释放资源。

5)删除容器和镜像。最后,利用DockerClient类的功能删除已经停止的容器,以及不再需要的镜像,以清理系统空间并确保安全性。

此外,确保系统的安全性,需要Docker容器进行超时限制、网络资源、内存资源和权限相关的设置。例如,将禁用容器的网络连接和容器的根文件系统设置为只读模式的权限设置如下:

CreateContainerResponse createContainerResponse

= containerCmd.withHostConfig(hostConfig)

.withNetworkDisabled(true)

.withReadonlyRootfs(true)

综上,通过沙箱技术,可以有效隔离用户代码的执行环境,避免用户恶意攻击或者造成系统崩溃。

3.5" 功能验收

以管理员身份登录系统进行题目管理、判题操作流程和效果。

管理员登录后,页面采用横向顶部导航栏,包括以下功能:首页、题目提交详情、创建题目、题目管理和用户管理。首页功能可查看用户活跃程度的报表、错题频率报表和用户积分排行榜。题目提交详情页面以列表方式呈现了所有用户答题完成情况。题目管理功能包含创建题目、修改题目、答题页面和判题功能。在创建题目流程中,可以编辑题目内容、设置判题要求,具体界面如图5所示。答题页面如图6所示,左侧显示题目内容,右侧为代码编译区,点击提交代码进行判题流程。通过以上功能,管理员可以轻松管理题目和监控用户的活跃情况,提高系统的运行效率。

4" 结" 论

针对当前计算机教育中编程题目人工判题效率低、不方便统计、难以衡量学生编程能力等问题,精心设计了一款自动判题系统。该系统采用主流互联网开发技术(微服务框架Spring Cloud、消息队列RabbitMQ、Docker容器等)完成开发,具备可独立开发部署、可扩展性强等优点。该系统功能齐全,包含用户管理、题目管理、统计报表等,以及核心的判题和代码沙箱功能。系统功能强大、简单易用、易于推广,并具有一定的实际使用价值。通过该系统,能够有效提高编程题目的判题效率,方便统计学生答题情况,以及更准确地评估学生的编程能力,为计算机教育及编程评估提供了有力支持。

参考文献:

[1] 徐伟,陈凯明,马建辉,等.计算机专业程序设计课程在线教学改革探究 [J].软件导刊,2020,19(12):181-184.

[2] 李西明,梁志才,刘龙浩,等.基于微服务架构的在线评判系统设计与实现 [J].软件导刊,2023,22(8):144-150.

[3] 洪生,王俊松.基于微服务的职业院校数据开放平台研究 [J].现代信息科技,2024,8(2):37-40.

[4] 李俊,江海.基于微服务架构的新零售系统设计与应用 [J].计算机时代,2023(3):106-110+115.

[5] 陶良敬,陈鑫,王旭,等.基于Spring Cloud的安徽建工电子商城系统的设计与实现 [J].自动化应用,2024,65(4):1-4.

[6] 谢颐,胡黎.基于SpringCloud框架微服务架构的融合媒体云平台设计 [J].软件,2024,45(1):134-136+173.

[7] 汪睿,胡珊珊,陈敏莲,等.基于Spring Cloud的分布式医疗数据平台建设 [J].设备管理与维修,2024(4):16-19.

[8] 唐权,周蓉,张勇.RabbitMQ消息中间件在Spring Boot教学中的应用 [J].现代信息科技,2020,4(18):125-127.

[9] 吴逸文,张洋,王涛,等.从Docker容器看容器技术的发展:一种系统文献综述的视角 [J].软件学报,2023,34(12):5527-5551.

[10] 杨志鹏,王鹃,马陈军,等.基于第三方库隔离的Python沙箱逃逸防御机制 [J].信息网络安全,2024,24(5):682-693.

作者简介:刘梅(1985—),女,汉族,江苏南京人,讲师,硕士,主要研究方向:计算机应用、智能算法;汤铭(1973—),男,汉族,浙江东阳人,高级工程师,学士,主要研究方向:计算机网络、高性能计算;李峥峰(2001-),男,汉族,河南安阳人,本科在读,主要研究方向:计算机应用。

基金项目:江苏高校哲学社会科学研究一般项目(2022SJYB0672)

标签:  系统 

免责声明

本文来自网络,不代表本站立场。如有不愿意被转载的情况,请联系我们。

iidomino cuppor