负载均衡式在线OJ

一、项目功能及描述

实现了一个负载均衡式的在线OJ平台,用户可以在浏览器查看所有题目列表并可以访问各个题目,用户可在编辑区编写代码提交。后端接收用户代码并将用户代码和测试用例组合,然后选择负载最低的主机,主机服务器把用户提交请求中的代码,写进一个XXX.CPP文件当中,子进程针对这个XXX.CPP进行编译,得到XXX.exe运行文件,如果编译出错,则把错误信息写入一个_stderr_fd文件当中。子进程针对XXX.exe文件进行执行,把标准输出和标准错误写进_stdout_fd、和_stderr_fd两个文件中,服务器读取_stdout_fd、和_stderr_fd获取运行结果并返回

二、项目演示

进入首页:
在这里插入图片描述

获取题目列表:
在这里插入图片描述
选择题目,进入编辑页面
在这里插入图片描述
用户提交代码
在这里插入图片描述

三、技术栈与开发环境

所用技术

C++ STL 标准库
Boost 准标准库(字符串切割)
cpp-httplib 第三方开源网络库
ctemplate 第三方开源前端网页渲染库
jsoncpp 第三方开源序列化、反序列化库
负载均衡设计
多进程、多线程
Ace前端在线编辑器(简单使用)
html/css/js/jquery/ajax (简单使用)

开发环境:

Centos 7 云服务器
vscode
vim/gcc(g++)

四、主要模块

公共模块:

提供一些时间戳获取,文件路径拼接,文件操作,字符串处理,网络请求,日志等项目里常用的功能。

编译与运行模块:

根据用户提交的代码与测试用例拼接后在服务器上进行编译,运行,得到结果返回给用户。

请求题目列表:

请求题目列表或一个具体题目,且具体题目有编辑区 ;提交判题请求。采用MVC的设计模式,使用负载均衡,访问文件,调用编译模块,以及把题目列表和编辑界面展示给用户。

四、具体运行过程

运行服务器:

构建题目信息:对题目信息运用unordered_map构建一个题号和题目的对应关系;

负载均衡模块:加载配置文件,解析出编译服务所有的主机信息(IP+端口号),保存所以主机的信息,并且记录在线主机的id。

前后端交互:

获取题目列表(GET):不需要参数,返回每个题目信息的json数组(题号、题目名、题目难易程度)

1、获取全部题目内容,题目内容放在vector中
2、按照题号排序
3、获取题目信息成功,将所有题目数据构建成网页(用ctemplate库渲染)

1、形成路径
2、形成数字典
3、获取渲染的html
4、开始完成渲染功能

获取指定题目的详细信息(GET):参数是题目id,返回是指定题目的json信息(题号、题名、题目内容等)

根据题号获取单个题目内容,进行渲染,并且返回新的html内容

编译运行(POST):参数是题目id和用户编写的代码(拼接好的),返回是编译运行的输出结果

1、根据题目编号,直接拿到对应的题目编号
2、in_json进行反序列化,得到题目的id,得到用户提交源代码,input
3、重新拼接用户代码+测试用例,形成新的代码
4、选择负载最低的主机(差错处理)
5、然后发起http请求,得到结果
6、将结果赋值给out_json

后端编译模块:

1、服务器把用户提交请求中的代码,写进一个XXX.CPP文件当中

2、子进程针对这个XXX.CPP进行编译,得到XXX.exe运行文件

3、如果编译出错,则把错误信息写入一个XXX.compile_error文件当中。

4、子进程针对XXX.exe文件进行执行,把标准输出和标准错误写进_stdout_fd、和_stderr_fd两个文件中

5、服务器读取_stdout_fd、和_stderr_fd获取运行结果并返回

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

清晨白米稀饭.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值