项目链接: https://github.com/Myriad-Dreamin/core-oj/tree/develop

思路:

  • 将worker分为两种, compiler & judger
  • compiler负责隔离编译环境,设置编译资源限制,权限限制
  • judger负责隔离运行环境,sandboxize
  • 设计结构体管理compilers/judgers
  • gin-server只是作为core的测试服务器,可以利用compiler/judger的daemon自行编写服务

compiler

  • daemon与compilers之间用grpc通信。
  • compiler的资源受到daemon管理,当compiler超时无反应时,直接摧毁compiler重建一个新的compiler,并向上级报告严重错误
  • compiler的language config可自定义,暴露的接口可以定义新的编译类型。

judger

  • 隔绝所有网络环境。
  • daemon与judgers之间用unix-socket通信。
  • 资源限制与judger类似。
  • 使用docker的用户映射,docker根用户root为物理机普通用户,除了共享容器的完全访问权限,没有其他任何权限。judger开辟子进程运行程序时,改变其uid-gid为运行时用户worker。worker只有目标程序的100权限,没有judger以及物理机其他的任何权限。

docker configuration

  • 采用alpine最小镜像
  • 支持c/c++/java/python2/python3的编译及运行。
  • c/c++编译器为g++,java sdk为openjdk8,python2,3版本分别为2.7,3.7。
  • 单个compiler占用外存273M,单个judger占用外存197M。

problem/code api

problem orm模型如下。

// Problem example
type Problem struct {ID       int    `xorm:"not null pk autoincr 'id'"`Name     string `xorm:"'name'"`OwnerUID int    `xorm:"owner_uid"`
}

OwnerUID为预设的用户uid。
大部分配置位于path/to/problem/Problem.ID/problem_config.xxx中。
problem-config支持yaml/xml/toml/json。
yaml的配置示例如下:

judge:judge-type: acmtasks:- name: tasktime-limit: 1000000000memory-limit: 262144input-path: /codes/output-path: /codes/
special-judge:enable: truelanguage-type: c++11file-path: /spj.cpp

查看源码: https://github.com/Myriad-Dreamin/core-oj/blob/develop/problem-config/problem-config.example.yml
judge支持多种类型acm (目前只支持acm类型,未来可能支持ioi, interactive类型等),可以将问题分为多个子类型。每个子类型允许设置时间限制/空间限制,输入/输出路径。
special judge支持多种语言类型的special judge,目前只支持testlib.lib(c++)

Example

目前项目编写了一个使用core编写Online Judge后端的示例。
查看源码: https://github.com/Myriad-Dreamin/core-oj/tree/develop/gin-server

支持的api接口如下:

codeService.Get /code/:id@GET

查询code信息

codeService.GetContent /code/:id/content@GET

查询code代码

codeService.GetResult /code/:id/result@GET

查询code judge的结果

codeService.PostForm /code/postform@POST

添加code

codeService.Delete /code/:id@DELETE

删除code

problemService.Get /problem/:id@GET

获取problem信息

problemService.PostForm /problem/postform@POST

添加problem

problemService.Delete /problem/:id@DELETE

删除problem

problemService.Stat /problemfs/:id/stat@GET

查询problem所属文件夹的文件信息

problemService.Mkdir /problemfs/:id/mkdir@PUT

查询problem所属文件夹的文件信息

problemService.Ls /problemfs/:id/ls@GET

查看problem所属文件夹下某文件夹所有文件

problemService.Read /problemfs/:id/read@GET

查看problem所属文件夹的文件内容

problemService.Write /problemfs/:id/write@POST

上传文件到problem所属文件夹

problemService.Writes /problemfs/:id/writes@POST

上传多个文件到problem所属文件夹

problemService.Zip /problemfs/:id/zip@POST

上传压缩包到problem所属文件夹并解压

problemService.ReadConfigV2 /problemfs/:id/config@GET

读取problem-config

problemService.PutConfig /problemfs/:id/config@PUT

修改problem-config

注意事项:

  • Alpine可运行文件需要经过linux,i386交叉编译,否则可能无法识别
  • 合理配置Docker,防止远程代码恶意行为

用gin+xorm+docker编写Online Judge后端相关推荐

  1. docker 一键部署前后端项目 ruoyi

    使用 docker 一键部署前后端项目 这里我以开源项目ruoyi 的 vue 前后端为例,想要通过 docker 一键跑起来,需要对项目做部分调整. 修改 springboot yml 的配置 ap ...

  2. 基于Go语言Gin+Xorm+Layui实现RBAC权限管理系统

    项目介绍 一款 Go 语言基于Gin.Xorm.Layui.MySQL等框架精心打造的一款模块化.高性能.企业级的敏捷开发框架,本着简化开发.提升开发效率的初衷触发,框架自研了一套个性化的组件,实现了 ...

  3. 基于Go语言Gin+Xorm的OA办公系统

    项目介绍 一款 Go 语言基于Gin.Xorm.Layui.MySQL等框架精心打造的一款模块化.高性能.企业级的敏捷开发框架,本着简化开发.提升开发效率的初衷触发,框架自研了一套个性化的组件,实现了 ...

  4. 基于Go语言Gin+Xorm实现的毕业设计神器

    项目介绍 一款 Go 语言基于Gin.Xorm.Layui.MySQL等框架精心打造的一款模块化.高性能.企业级的敏捷开发框架,本着简化开发.提升开发效率的初衷触发,框架自研了一套个性化的组件,实现了 ...

  5. 基于Go语言框架Gin+Xorm搭建的MVC项目

    项目介绍 一款 Go 语言基于Gin.Xorm.Layui.MySQL等框架精心打造的一款模块化.高性能.企业级的敏捷开发框架,本着简化开发.提升开发效率的初衷触发,框架自研了一套个性化的组件,实现了 ...

  6. linux启动php服务_群晖docker 实现nodejs为后端的简单web服务器 并连接数据库

    前情摘要:虽然群晖有web station 作为开发简单网页的服务器首选,但是web station 里面最好用的技术栈还是基于LNMP或者LAMP的php开发环境.对于学习nodejs的同学可能丈二 ...

  7. go java web框架_java程序员10分钟可上手的golang框架golang实战使用gin+xorm搭建go语言web框架restgo...

    1.首先上效果 是不是想起spring MVC? cd $GOPATH/src git clone https://github.com/winlion/restgo-admin.git 你将得到re ...

  8. 编写python程序实现分段函数_python分段函数如何编写?_后端开发

    C语言自定义函数(图文详解)_后端开发 每个C程序都至少有一个函数,即主函数main(),在实际开发中,程序的任务往往比较复杂,如果全部的代码都写在main()函数中,main()函数将非常庞大臃肿, ...

  9. docker ss-pannel_ss-panel-v3-mod_Uim 端口偏移后端教程

    释放双眼,带上耳机,听听看~! 后端安装: 通过前面的文章,我们已经解释了,前端只是作为显示节点,具体控制还是需要通过后端完成. 后端我们如何控制呢? 通过Docker自带的端口映射功能,详细解释下, ...

  10. clion卸载+clion连接docker编写trt程序

    一.卸载 # 删除安装文件夹 1.rm -r clion-2021.1.1 # 删除配置文件 2.sudo rm -rf ~/.config/JetBrains/CLion2021.1 二.连接doc ...

最新文章

  1. telnet命令的使用
  2. 一到关于js函数的前端面试题引发的血案
  3. statsmodels 笔记:seasonal_decompose 时间序列分解
  4. 学习Vue的一些看法
  5. FPGA学习及设计中的注意事项
  6. linux arm下硬件驱动程序放哪里,Arm-Linux摄像头驱动程序的移植
  7. 大数据_Flink_数据处理_流式数据源测试---Flink工作笔记0010
  8. [转载]Dynamic Database Switching in Rails - How to do it
  9. 通过ResNet-50进行面部表情识别(易懂)
  10. vue报错 Uncaught (in promise) NavigationDuplicated {_name:““NavigationDuplicated“... 的解决方法
  11. 白板推导系列Pytorch-隐马尔可夫模型(HMM)
  12. [转] 跨域资源共享 CORS 详解
  13. node+redis+阿里云短信验证码,注册手机验证码完整功能代码
  14. Java随机生成加减乘除运算,并记录结果
  15. ios代码中的内存泄露,内存检测工具leaks 检测不出来
  16. android直播音频开发准备
  17. STM32单片机的启动模式 三种BOOT模式介绍
  18. linux某服务启动失败,提示Authorization not available. Check if polkit...问题解决
  19. 从0开始带你成为jvm实战高手(狸猫技术窝)
  20. SMPTE ST 2110 概论(二)

热门文章

  1. 苹果试玩换个新id行不_苹果试玩换ID可以重复任务吗
  2. 强大的矢量绘图软件Sketch
  3. 【JSOI2018】绝地反击
  4. python 将QQ聊天记录生成词云图
  5. 机器学习领域著名的期刊与会议
  6. 如何使用GoldWave中文版将语音转化为文字
  7. elasticsearch minimum_should_match
  8. 【NLP】计算所汉语词性标记集
  9. Google搜索引擎算法研究
  10. VUE项目配置UEditor集成秀米编辑器