一个用 C++ 实现的简易在线判题系统(Online Judge),采用一个 OJ 网关服务 + 多个编译执行服务的负载均衡架构。
本项目模拟真实 OJ 的核心流程:
- 展示题目列表与题面。
- 在网页中提交 C++ 代码。
- 由 OJ 服务根据负载选择一台编译服务器执行编译与运行。
- 返回运行结果(标准输出、错误信息、状态码等)。
适合用于:
- 学习网络服务与微服务拆分。
- 学习在线判题系统的基本实现。
- C++ Web 后端练手项目。
项目由 3 个核心模块组成:
-
comm/:公共基础模块
- 通用工具与日志封装。
- HTTP 依赖头文件。
-
compile_server/:编译与运行服务
- 接收代码、编译、运行并返回结果。
- 可部署多个实例,作为后端执行节点。
-
oj_server/:OJ 网关服务
- 提供题目列表、题目详情、代码提交入口。
- 维护编译服务列表并做负载均衡调度。
- 聚合并返回最终响应给前端。
整体是典型 B/S(Browser/Server)形态:浏览器访问 oj_server,oj_server 负责静态资源与 API,并将代码执行请求转发到某一台 compile_server。
.
├── comm/ # 公共模块(日志、工具、HTTP 头文件)
├── compile_server/ # 编译运行服务
├── oj_server/ # OJ 网关服务 + 前端页面 + 题库
├── LICENSE
├── Makefile # 顶层构建
├── README.md
└── README.en.md
建议在 Linux 环境下构建与运行:
g++(支持 C++11/14/17,按代码实际要求)makemysql(如启用数据库题库)
题目数据既可以走文件,也可以走 MySQL(取决于你的配置与代码路径)。
makecd compile_server && make
cd ../oj_server && make以下为通用流程,实际命令以各模块 Makefile 产物为准。
- 先启动一个或多个
compile_server实例(可不同端口)。 - 再启动
oj_server。 - 浏览器访问
oj_server提供的页面地址。 - 提交代码后,由
oj_server负载均衡到某个编译节点执行。
oj_server/conf/service_machine.conf:配置编译服务节点列表。oj_server/questions/:题目与测试用例数据。
在多节点部署时,可通过新增配置项扩展 compile_server 节点,实现水平扩展。
- 题目展示与代码提交。
- 代码编译与运行。
- 基于服务列表的简单负载均衡。
- 前后端一体化(静态页面 + 后端接口)。
- 更完善的判题策略(多测试点、资源限制、对比器)。
- 沙箱隔离(namespace/cgroup/seccomp)。
- 任务队列与异步判题。
- 节点健康检查与动态摘除。
- 用户系统、排行榜、提交记录持久化。
欢迎提交 Issue / PR:
- Fork 本仓库
- 新建功能分支
- 提交代码并补充说明
- 发起 Pull Request
本项目采用仓库内 LICENSE 文件所述许可证。