Skip to content

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

9 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

负载均衡在线 OJ(OnLineJudge)

一个用 C++ 实现的简易在线判题系统(Online Judge),采用一个 OJ 网关服务 + 多个编译执行服务的负载均衡架构。

项目简介

本项目模拟真实 OJ 的核心流程:

  • 展示题目列表与题面。
  • 在网页中提交 C++ 代码。
  • 由 OJ 服务根据负载选择一台编译服务器执行编译与运行。
  • 返回运行结果(标准输出、错误信息、状态码等)。

适合用于:

  • 学习网络服务与微服务拆分。
  • 学习在线判题系统的基本实现。
  • C++ Web 后端练手项目。

架构设计

项目由 3 个核心模块组成:

  1. comm/:公共基础模块

    • 通用工具与日志封装。
    • HTTP 依赖头文件。
  2. compile_server/:编译与运行服务

    • 接收代码、编译、运行并返回结果。
    • 可部署多个实例,作为后端执行节点。
  3. oj_server/:OJ 网关服务

    • 提供题目列表、题目详情、代码提交入口。
    • 维护编译服务列表并做负载均衡调度。
    • 聚合并返回最终响应给前端。

整体是典型 B/S(Browser/Server)形态:浏览器访问 oj_serveroj_server 负责静态资源与 API,并将代码执行请求转发到某一台 compile_server

目录结构

.
├── comm/                 # 公共模块(日志、工具、HTTP 头文件)
├── compile_server/       # 编译运行服务
├── oj_server/            # OJ 网关服务 + 前端页面 + 题库
├── LICENSE
├── Makefile              # 顶层构建
├── README.md
└── README.en.md

依赖环境

建议在 Linux 环境下构建与运行:

  • g++(支持 C++11/14/17,按代码实际要求)
  • make
  • mysql(如启用数据库题库)

题目数据既可以走文件,也可以走 MySQL(取决于你的配置与代码路径)。

构建方式

方式一:顶层构建

make

方式二:分别构建

cd compile_server && make
cd ../oj_server && make

运行说明(示例)

以下为通用流程,实际命令以各模块 Makefile 产物为准。

  1. 先启动一个或多个 compile_server 实例(可不同端口)。
  2. 再启动 oj_server
  3. 浏览器访问 oj_server 提供的页面地址。
  4. 提交代码后,由 oj_server 负载均衡到某个编译节点执行。

配置说明

  • oj_server/conf/service_machine.conf:配置编译服务节点列表。
  • oj_server/questions/:题目与测试用例数据。

在多节点部署时,可通过新增配置项扩展 compile_server 节点,实现水平扩展。

当前实现特性

  • 题目展示与代码提交。
  • 代码编译与运行。
  • 基于服务列表的简单负载均衡。
  • 前后端一体化(静态页面 + 后端接口)。

可改进方向

  • 更完善的判题策略(多测试点、资源限制、对比器)。
  • 沙箱隔离(namespace/cgroup/seccomp)。
  • 任务队列与异步判题。
  • 节点健康检查与动态摘除。
  • 用户系统、排行榜、提交记录持久化。

贡献指南

欢迎提交 Issue / PR:

  1. Fork 本仓库
  2. 新建功能分支
  3. 提交代码并补充说明
  4. 发起 Pull Request

License

本项目采用仓库内 LICENSE 文件所述许可证。

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages