OJ在线判题系统项目笔记
项目介绍
在线评测编程题目代码的系统,出题人预先设置题目的输入样例和输出样例,根据用户提交代码,进行编译代码,运行代码,判断代码执行结果是否正确。
后端服务
网关服务
接收前端请求,转发到对应的服务
用户服务
用户注册、用户登录、用户退出
题目服务
题目浏览,在线做题,题目提交、提交记录
判题服务
判题服务获取调用题目服务获取题目信息,测试用例,调用代码沙箱编译运行代码并对比结果
代码沙箱
编译运行代码,返回执行结果、运行时间、运行内存
公共模块
数据模型、统一异常处理、全局响应封装、工具类
judgeCase:判题用例,包括输入用例和输出用例
judgeInfo:判题信息,包括程序执行信息,运行时间,运行内存
judgeContext:判题上下文,包括题目信息,编程语言,输出用例,输出结果,判题信息
微服务架构优点
微服务架构是一种软件架构风格,把大而全的单体应用拆分为多个职责单一的模块,每个服务单元独立部署,运行和维护。服务单元之间通过网络通信进行交互,从而实现完整系统的功能。微服务架构可以提高系统的灵活性,可维护性,可扩展性,容错性。
本项目中,使用微服务架构将较重的服务(判题服务和代码沙箱)和核心服务(用户服务和题目服务)进行分离解耦,即使判题服务因为代码沙箱压力过大而阻塞,也不会影响核心业务运行。
用户服务
普通用户
注册、登录、获取登录用户、注销、修改个人信息
管理员
增删改 根据id获取用户(包装类) 分页获取用户(包装类)
题目服务
管理员
增删改、根据id获取题目、分页获取题目
普通用户
分页获取题目(包装类)、根据id获取题目(包装类)、分页获取题目提交列表、根据id获取提交题目详情
提交题目(限流器)
题目提交流程
向题目提交表记录题目id,用户id,编程语言和用户代码,设置判题状态为待判题。通过消息队列将questionSubmit对象传递给判题服务
限流器
// 1、 声明一个限流器
RRateLimiter rateLimiter = redissonClient.getRateLimiter(key);// 2、 设置速率,5秒中产生3个令牌
rateLimiter.trySetRate(RateType.OVERALL, 3, 5, RateIntervalUnit.SECONDS);// 3、试图获取一个令牌,获取到返回true
rateLimiter.tryAcquire(1)
RateType.OVERALL:所有实例共享令牌
RateType.PER_CLIENT�:单实例令牌数
redission分布式限流采用令牌桶思想和固定时间窗口,trySetRate方法设置桶的大小,利用redis key过期机制达到时间窗口目的,控制固定时间窗口内允许通过的请求量。
判题服务
判题模块作用
查询题目提交和题目信息,调用代码沙箱,把代码和输入用例交给代码沙箱去执行,收集输出结果并执行判题逻辑
判题流程
通过消息队列获得questionSubmit对象,获取题目信息,判断题目是否存在。存在提交数加1。获取用户代码,编程语言,输入用例,输出用例。更新判题状态为判题中,调用代码沙箱,获取程序运行结果,设置判题上下文对象,采用策略模式,调用不同判题方法进行判题(主要是比较不同语言的时间和内存是否超出限制以及输出用例和代码沙箱程序执行结果是否一致)设置判题状态(判题成功/判题失败)和通过数
多种代码沙箱
定义通用代码沙箱调用接口,提供多种代码沙箱的实现类
实例代码沙箱:跑通业务流程
远程代码沙箱:自主实现的代码编译、执行的沙箱接口
三方代码沙箱:开源的代码沙箱服务 judge0的代码沙箱
远程和三方代码沙箱通过http调用
沙箱类型配置化:application.yml中动态配置沙箱类型
沙箱实例工厂化:读取配置,适用工厂模式,创建对应的代码沙箱实现类
沙箱调用代理化:使用代理模式,在调用代码沙箱前后进行统一的日志操作
代码沙箱
实现方式
Java原生代码沙箱和Docker代码沙箱
实现思路
用户代码保存为文件
编译代码,得到class文件
String compileCmd = "javac -encoding utf-8 Main.java";
Process compileProcess = Runtime.getRuntime().exec(comoileCmd);
int exitCode = compileProcess.waitFor()
if(exitCode==0){逐行读取输出;
}else{逐行读取正常输出;逐行读取异常输出;
}
执行java代码
String runCmd = "java Main.java"+inputArgs;
Process runProcess = Runtime.getRuntime().exec(runCmd);
收集整理输出结果
执行结果、执行时间、执行内存
文件清理,释放空间
错误处理,提升程序健壮性
异常情况
执行超时
占用内存
读文件
写文件
运行其他程序
执行高危操作
安全控制
超时控制
创建守护线程,超时自动中断Process
限制资源分配
java -Xmx256M
限制最大占用堆空间256M
限制代码–黑白名单
public static final List<String> balckList = Arrays.asList("Files","exec");
限制权限
Java安全管理器
public class DefaultSecurityManager extends SecurityManager{public void checkPermission(Permission perm) {throw new RuntimeException("权限异常"+perm.toString());}public void checkRead(String file) {throw new RuntimeException("Read权限异常"+file);}public void checkWrite(String file) {throw new RuntimeException("Write权限异常"+file);}public void checkExec(String file) {throw new RuntimeException("Exec权限异常"+file);}public void checkConnect(String host,int port) {throw new RuntimeException("Connect权限异常"+host+":"+port);}}
执行Java代码时
java -Dfile.encoding=UTF-8 -Djava.security.manager=DefaultSecurityManager -cp . Main
运行环境隔离
Java原生代码沙箱
通过Process.exec执行命令行操作来执行代码,并通过Process对象的流来获取输出结果,不够安全
Docker代码沙箱
创建隔离的Java容器并且通过exec命令在容器内执行Java代码和获取输出,更加安全。
用户代码保存为文件
编译为.class文件
拉取镜像、创建容器、运行容器,执行代码,得到输出结果
创建一个交互容器,创建容器时,指定文件路径,把本地文件同步到容器中
创建容器时,进行内存限制,网络限制,读写限制
设计模式
工厂模式
代理模式
策略模式
模版方法模式
相关文章:
OJ在线判题系统项目笔记
项目介绍 在线评测编程题目代码的系统,出题人预先设置题目的输入样例和输出样例,根据用户提交代码,进行编译代码,运行代码,判断代码执行结果是否正确。 后端服务 网关服务 接收前端请求,转发到对应的服…...
期望极大算法(Expectation Maximization Algorithm,EM)
定义 输入:观测变量数据Y,隐变量数据Z,联合分布P(Y,Z| θ \theta θ),条件分布PP(Z,Y| θ \theta θ); 输出:模型参数 θ \theta θ (1)选择参数的初值 θ ( 0 ) , 开始迭代 ; \theta^{(0)},开始迭代; θ(0),开始迭代; (2)E步:记 θ ( i ) 为第 i 次迭代参数 \theta^{(i)}为第…...
初级练习[4]:多表查询——表联结
目录 多表查询:表联结示例 查询有两门以上的课程不及格的同学的学号及其平均成绩 查询所有学生的学号、姓名、选课数、总成绩 查询平均成绩大于85的所有学生的学号、姓名和平均成绩 查询学生的选课情况:学号,姓名,课程号,课程名称 查询出每门课程的及格人数和不及格人数 …...
基于JAVA+SpringBoot+Vue的中药实验管理系统
基于JAVASpringBootVue的中药实验管理系统 前言 ✌全网粉丝20W,csdn特邀作者、博客专家、CSDN[新星计划]导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 🍅文末附源码下载链接🍅 哈…...
移动硬盘读取出错结构损坏?数据恢复实战指南
移动硬盘困境:读取出错与结构损坏 在日常的数据存储与传输中,移动硬盘以其大容量、便携性成为了众多用户的首选。然而,当移动硬盘遭遇读取出错或结构损坏的困境时,那些珍贵的文件、照片、视频等数据便岌岌可危,让人心…...
Web安全之HTTPS调用详解和证书说明案例示范
随着互联网的高速发展,网络安全成为了一个不可忽视的话题,特别是在涉及用户敏感信息的业务系统中。在此背景下,使用HTTPS取代HTTP成为了大势所趋。本文将以电商交易系统为例,详细介绍HTTPS的重要性,并探讨如何通过HTTP…...
man命令学习记录
使用man来查看命令的用法 man ls 想了解Linux命令的用法假设你想查ls命令的更多信息,输入man ls,就会打开man page(man是manual的缩写,因此man page就是“手册页面”),显示关于ls命令各个方面的信息。 通常…...
Linux三剑客-grep
grep介绍 全拼: Global search REgular expression and Print out line. 作用: 文本搜索工具,根据用户指定的“模式(过滤条件)”对目标文本逐行进行匹配检查,打印匹配到的行。 模式: 有正则表达…...
备忘录模式memento
学习笔记,原文链接 https://refactoringguru.cn/design-patterns/memento 允许生成对象状态的快照并在以后将其还原。备忘录不会影响它所处理的对象的内部结构, 也不会影响快照中保存的数据。...
5-【JavaWeb】JUnit 单元测试及JUL 日志系统
1. 使用 JUnit 进行单元测试 JUnit 是 Java 中非常流行的单元测试框架,MyBatis 与 JUnit 可以很好地结合,来测试持久层代码的正确性。 1.1 添加 JUnit 依赖 在使用 JUnit 之前,需要在 pom.xml 中引入 JUnit 依赖。 <dependency><…...
多人开发小程序设置体验版的痛点
抛出痛点 在分配任务时,我们将需求分为三个分支任务,分别由前端A、B、C负责: 前端A: HCC-111-实现登录功能前端B: HCC-112-实现用户注册前端C: HCC-113-实现用户删除 相应地,我们创建三个功能分支: feature_HCC-111-实现登录功能feature_HCC-112-实现用户注册feature_HCC-1…...
【Kubernetes】常见面试题汇总(七)
目录 20.简述 Kubernetes 创建一个 Pod 的主要流程? 21.简述 Kubernetes 中 Pod 的重启策略? 20.简述 Kubernetes 创建一个 Pod 的主要流程? Kubernetes 中创建一个 Pod 涉及多个组件之间联动,主要流程如下: &#…...
EmguCV学习笔记 C# 11.1 DnnInvoke类
版权声明:本文为博主原创文章,转载请在显著位置标明本文出处以及作者网名,未经作者允许不得用于商业目的。 EmguCV是一个基于OpenCV的开源免费的跨平台计算机视觉库,它向C#和VB.NET开发者提供了OpenCV库的大部分功能。 教程VB.net版本请访问…...
论文解读 | ACL2024 Outstanding Paper:因果指导的主动学习方法:助力大语言模型自动识别并去除偏见...
点击蓝字 关注我们 AI TIME欢迎每一位AI爱好者的加入! 点击阅读原文观看作者直播讲解回放! 作者简介 孙洲浩,哈尔滨工业大学SCIR实验室博士生 概述 尽管大语言模型(LLMs)展现出了非常强大的能力,但它们仍然…...
xLSTM模型学习笔记
笔记来源:bilibili LSTM 回顾 原始的 LSTM 是为了解决 RNN 时序反向传播中梯度消失和爆炸问题而提出的。 其所谓的门控机制,其实就是一种时序上的注意力机制,相当于把不同时间进行"掺和",是对时序信息的一种选择性控制…...
woocommerce 调用当前product_tag 为标题
要在 WooCommerce 中调用当前产品标签(product tag)作为标题,你可以使用以下代码。这段代码将获取当前产品标签的名称,并将其显示为标题。 <?php // 获取当前产品标签名称 $current_tag single_term_title(, false);// 检查是…...
音视频开发:基于sdl的pcm播放器
源码 /*** SDL2播放PCM*** 本程序使用SDL2播放PCM音频采样数据。SDL实际上是对底层绘图* API(Direct3D,OpenGL)的封装,使用起来明显简单于直接调用底层* API。* 测试的PCM数据采用采样率44.1k, 采用精度S16SYS, 通道数2** 函数调…...
[产品管理-6]:NPDP新产品开发 - 4 - 战略 - 创新支持战略,支持组织的总体创新战略(平台战略、技术战略、营销战略、知识产权战略、能力建设战略)
目录 一、创新支持战略概述 二、平台战略:大平台小产品战略 2.1 概述 1、平台战略的定义 2、平台战略的特点 3、平台战略的应用领域 4、平台战略的成功案例 5、平台战略的发展趋势 2.2 大平台小产品战略 1)大平台的建设 2)、小产品…...
Cursor:程序员的AI助手,开启智能编程新时代
在当今快节奏的软件开发世界,效率和准确性是成功的关键。而 Cursor,作为一款创新的人工智能编程工具,正在极大地改变着编程的面貌,为开发者带来前所未有的便捷与惊喜。 智能代码生成 Cursor 利用强大的人工智能模型,…...
OpenAI 刚刚发布了新的Sora视频——实现的真人效果令人惊叹
在 YouTube 上发布了两段由专业创作者制作的新的“Sora Showcase”视频。这些视频展示了尚未发布的 Sora AI 视频模型的惊人潜力。 Sora 于今年二月首次宣布,但由于生成时间、成本和错误信息的潜在风险,光年AI 仅向一小部分创作者 开放了该模型。 自So…...
【人工智能】神经网络的优化器optimizer(二):Adagrad自适应学习率优化器
一.自适应梯度算法Adagrad概述 Adagrad(Adaptive Gradient Algorithm)是一种自适应学习率的优化算法,由Duchi等人在2011年提出。其核心思想是针对不同参数自动调整学习率,适合处理稀疏数据和不同参数梯度差异较大的场景。Adagrad通…...
以下是对华为 HarmonyOS NETX 5属性动画(ArkTS)文档的结构化整理,通过层级标题、表格和代码块提升可读性:
一、属性动画概述NETX 作用:实现组件通用属性的渐变过渡效果,提升用户体验。支持属性:width、height、backgroundColor、opacity、scale、rotate、translate等。注意事项: 布局类属性(如宽高)变化时&#…...
蓝桥杯 2024 15届国赛 A组 儿童节快乐
P10576 [蓝桥杯 2024 国 A] 儿童节快乐 题目描述 五彩斑斓的气球在蓝天下悠然飘荡,轻快的音乐在耳边持续回荡,小朋友们手牵着手一同畅快欢笑。在这样一片安乐祥和的氛围下,六一来了。 今天是六一儿童节,小蓝老师为了让大家在节…...
什么是库存周转?如何用进销存系统提高库存周转率?
你可能听说过这样一句话: “利润不是赚出来的,是管出来的。” 尤其是在制造业、批发零售、电商这类“货堆成山”的行业,很多企业看着销售不错,账上却没钱、利润也不见了,一翻库存才发现: 一堆卖不动的旧货…...
(二)原型模式
原型的功能是将一个已经存在的对象作为源目标,其余对象都是通过这个源目标创建。发挥复制的作用就是原型模式的核心思想。 一、源型模式的定义 原型模式是指第二次创建对象可以通过复制已经存在的原型对象来实现,忽略对象创建过程中的其它细节。 📌 核心特点: 避免重复初…...
在Ubuntu中设置开机自动运行(sudo)指令的指南
在Ubuntu系统中,有时需要在系统启动时自动执行某些命令,特别是需要 sudo权限的指令。为了实现这一功能,可以使用多种方法,包括编写Systemd服务、配置 rc.local文件或使用 cron任务计划。本文将详细介绍这些方法,并提供…...
Web 架构之 CDN 加速原理与落地实践
文章目录 一、思维导图二、正文内容(一)CDN 基础概念1. 定义2. 组成部分 (二)CDN 加速原理1. 请求路由2. 内容缓存3. 内容更新 (三)CDN 落地实践1. 选择 CDN 服务商2. 配置 CDN3. 集成到 Web 架构 …...
ABAP设计模式之---“简单设计原则(Simple Design)”
“Simple Design”(简单设计)是软件开发中的一个重要理念,倡导以最简单的方式实现软件功能,以确保代码清晰易懂、易维护,并在项目需求变化时能够快速适应。 其核心目标是避免复杂和过度设计,遵循“让事情保…...
AI,如何重构理解、匹配与决策?
AI 时代,我们如何理解消费? 作者|王彬 封面|Unplash 人们通过信息理解世界。 曾几何时,PC 与移动互联网重塑了人们的购物路径:信息变得唾手可得,商品决策变得高度依赖内容。 但 AI 时代的来…...
mac 安装homebrew (nvm 及git)
mac 安装nvm 及git 万恶之源 mac 安装这些东西离不开Xcode。及homebrew 一、先说安装git步骤 通用: 方法一:使用 Homebrew 安装 Git(推荐) 步骤如下:打开终端(Terminal.app) 1.安装 Homebrew…...
