# LoadBalancing-OJ-system **Repository Path**: keanu_zhang/load-balancing-oj-system ## Basic Information - **Project Name**: LoadBalancing-OJ-system - **Description**: “基于C++的负载均衡OJ系统” 是一个在线评测系统,旨在处理大规模用户提交的编程题目;系统通过负载均衡技术,将提交的任务动态分配到多个后端评测机上进行评测,以提高系统的处理能力和响应速度;该系统可以评测基本的编程题目,支持语言为C/C++。 - **Primary Language**: C/C++ - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 1 - **Created**: 2025-02-20 - **Last Updated**: 2025-06-11 ## Categories & Tags **Categories**: Uncategorized **Tags**: 负载均衡, 系统平台 ## README # LoadBalancing-OJ-system **写在前面:该项目目前仅为V1.0版本下的开源学习项目,后续若对平台继续进行迭代和拓展,版本将会继续同步在该仓库中,敬请期待...** #### 介绍 负载均衡OJ是一个在线评测系统,旨在处理大规模用户提交的编程题目。系统通过负载均衡技术,将提交的任务动态分配到多个后端评测机上进行评测,以提高系统的处理能力和响应速度。该系统可以评测基本的编程题目,支持语言为C/C++。前端界面基于HTML、CSS和JavaScript技术栈打造,旨在提供直观且用户友好的交互体验(需要补充说明:我们前端只进行简单的页面编写,主要目的是为了进行前后端的沟通及后端模块的响应请求测试)。后端服务运用C/C++语言进行开发,专注于业务逻辑处理、数据库交互以及负载均衡等关键算法程序的功能设计。后端设计以高性能和高并发性为核心考量,确保系统能够快速响应海量用户请求,支持大规模用户同时在线。 #### 软件架构 该项目为B/S系统架构(具体如下图所示),用户工作界面是通过浏览器界面来呈现。核心事务逻辑在服务器端实现,客户端主要负责用户界面的展示和用户请求的发送。整个软件系统我们分为三大开发模块:comm模块、oj_server模块和compile_server模块。comm模块存放我们整个项目中所用到的公共方法及库函数;compile_server模块是我们对用户提交的代码进行编译和运行的模块、并将结果返回;oj_server模块采用MVC设计模式,该模块实现了前后端的请求与响应、协同与处理等关键功能。 ![输入图片说明](pictures/image1.png) #### 技术栈说明 1.C++ STL:充分利用C++标准模板库的容器、算法等功能,实现评测系统的核心逻辑和数据处理功能。 2.cpp-httplib:采用cpp-httplib作为HTTP服务器库,处理用户提交的代码请求,并返回评测结果和反馈。 3.ctemplate:使用ctemplate作为模板引擎,动态生成网页内容,进行页面渲染,展示评测结果和题目信息等。 4.jsoncpp:利用jsoncpp解析和生成JSON格式数据,用于与前端页面交互和数据传输。 5.Boost:利用Boost库中的字符串切割功能,创建一个封装类来统一处理项目中的字符串切割任务,提升代码复用性和健壮性。 6.MySQL C API:通过MySQL C API与数据库进行交互,存储用户信息、题目数据和评测结果等重要信息,保证数据的持久化和安全性。 7.负载均衡算法:设计并实现了负载均衡算法,考虑评测机的负载情况、性能指标和实时请求量等因素,动态调整任务分配策略,实现系统资源的有效利用和负载的均衡。 8.多进程、多线程:多进程技术充分利用了多核CPU的计算能力,提高了代码编译和运行的效率;而多线程技术则确保了在线OJ服务模块的高并发处理能力,满足了大量用户同时访问的需求。 9.HTML/CSS/JS:用于前端页面开发等(不做细节说明)。 #### 安装使用教程说明 1.在云服务器(Linux系统)使用git clone https://gitee.com/keanu_zhang/load-balancing-oj-system.git指令,将该仓库下的项目克隆到云服务器本地; 2.在启动服务之前我们需要先查看我们的环境配置,gcc版本要在9.3.1-2以上,否则makefile无法成功运行; 3.基本的环境配置完成后,就可以进入oj_server模块,使用make命令执行makefile文件,形成oj_server可执行程序,./oj_server开始运行;然后新建多个服务进程用来为compile_server的运行做准备,进入compile_server模块中,依旧使用make命令执行makefile文件,形成compile_server可执行程序,因为在云端服务器平台我只开放了8081、8082、8083这三个进程端口(具体情况自行调配即可),因此我们使用./compile_server 8081、./compile_server 8082、./compile_server 8083来启动三个服务进程。此时我们的项目就已经完全启动了,具体情况如下图所示: ![输入图片说明](pictures/image2.png) 4.上文已经提到过我们该平台只是用于基本的后端开发学习,没有任何商业化的用途和意义,所以我们只搭建了丐版的前端页面,也只录入了一道相应的编程题用于测试。通过网页进入我们的OJ平台,进入相应的编程界面,即可开始进行编程测试,通过我们后端服务器的日志反馈情况来查看,具体情况如下面几幅图所示: ![输入图片说明](pictures/imageM3.png) ![输入图片说明](pictures/imageM4.png) ![输入图片说明](pictures/imageM5.png) 5.前端进行相应的请求,后端服务器的响应如下图所示: ![输入图片说明](pictures/image6.png) #### 企业级部署的设计 对于企业级的集群式部署,情况模拟如下图所示(该图我们只是大致的进行了模拟抽象,在实际的企业级部署中要更加复杂): ![输入图片说明](pictures/image7.png) 上图中红色的负载均衡技术区域,就是我们oj_server模块下的LoadBalance.hpp文件,也就是我们所实现的负载均衡算法的关键模块。在这里我提出一种环形缓冲区+负载均衡算法的技术,逻辑设计情况如下图所示。通过这种技术的设计,系统能够更好地处理高并发集群式场景,实现了快速响应和高并发处理,显著提升了后端负载均衡的性能。从而有望为用户提供一个更加稳定、高效和易于使用的在线编程评测环境。 ![输入图片说明](pictures/image8.png) #### 参与贡献 1. Fork 本仓库 2. 新建 Feat_xxx 分支 3. 提交代码 4. 新建 Pull Request #### 特技 1. 使用 Readme\_XXX.md 来支持不同的语言,例如 Readme\_en.md, Readme\_zh.md 2. Gitee 官方博客 [blog.gitee.com](https://blog.gitee.com) 3. 你可以 [https://gitee.com/explore](https://gitee.com/explore) 这个地址来了解 Gitee 上的优秀开源项目 4. [GVP](https://gitee.com/gvp) 全称是 Gitee 最有价值开源项目,是综合评定出的优秀开源项目 5. Gitee 官方提供的使用手册 [https://gitee.com/help](https://gitee.com/help) 6. Gitee 封面人物是一档用来展示 Gitee 会员风采的栏目 [https://gitee.com/gitee-stars/](https://gitee.com/gitee-stars/)