项目
- 项目(重点)
- 问题1:描述在网页中题目点击提交后到题目结果出现的一系列后台反应
- 【1】如何获取到用户提交的代码的?
- 【2】_1. 题目细节都有哪些?
- 【2】_2. 题目信息怎么存储的?
- 【3】负载均衡算法的实现?
- 【4】oj_server怎么连接对应的compile_server(编译主机)的?
- 【5】oj_server怎么把最终结果返回给客户端?
- 问题2:HTTP底层网络层是如何进行交互的?
- 问题3:这个项目超时或者占用内存过多报错机制如何实现的?
- 问题4:介绍一下这个项目
- 问题5:做这个项目过程中遇到的挑战
项目(重点)
问题1:描述在网页中题目点击提交后到题目结果出现的一系列后台反应
先简要概述:
- 请求接收和处理
- 用户的提交请求通过HTTP发送到oj_server服务器
- OJ服务模块接收请求并获取到用户提交的代码【1】,调用控制模块进行处理
- 代码拼接
- 控制模块调用model模块获取题目细节【2】,再将用户提交的代码和测试用例代码进行拼接(以JSON字符串进行拼接)
- 选择负载最低的主机编译运行代码
使用RR轮询算法【3】选择负载最低的主机,连接对应主机进行编译运行服务【4】,得到结果后返回给oj_server,oj_server再返回给客户端【5】
【1】如何获取到用户提交的代码的?
通过http的post请求拿到包含用户代码(body(josn字符串))的响应正文,响应正文实际上就是一个结构体,再直接用结构体对象直接访问对应的body【这里的body是json字符串】,将body反序列化后就能得到用户代码了
注:(httplib库的json就是string)
【2】_1. 题目细节都有哪些?
- 题目的编号,唯一
- 题目的标题
- 难度:简单,中等,困难
- 题目的描述
- 题目预设给用户在线编辑器的代码
- 题目的测试用例,需要和header拼接,形成完整代码
- 题目的时间要求(s)
- 题目的空间要求(kb)
【2】_2. 题目信息怎么存储的?
使用数据库进行存储的,是以题目的编号为主键(number)建的一个题目表
【3】负载均衡算法的实现?
算法类型:基于RR轮询算法。
核心逻辑:
-
遍历所有在线主机,找到当前负载最小的主机。
-
将请求分配给负载最小的主机。
-
更新主机的负载计数。
在oj_control.hpp文件中,负载均衡算法主要由LoadBlancer类实现。
LoadBlancer类
// 可以给我们提供服务的所有主机// 每台主机都有自己的下标。充当当前主机的idstd::vector<Machine> machines;//Machine是一个主机类// 所有在线的主机std::vector<int> online;// 所有离线的主机std::vector<int