综述
这个项目可以让用户可以在平台上进行做题和判题。用户可以通过登录和注册功能方便地使用平台。平台提供了多道题目供用户选择,也可以自己导入,并且可以直接在网页上进行代码的编写和编辑。当用户完成编写后,平台可以对代码进行编译和运行,并实时返回运行结果,让用户可以直接查看和分析自己的代码运行情况。
依赖
- MySQL
- Redis
- cpp-http
- Redis
- ZeroMQ
- jsoncpp
- boost标准库
- ctemplate
安装
git clone git@github.com:zevin02/OnlineJudge.git
cd OnlineJudge
make
文件架构
- comm
存放的就是公共模块
- oj_server
存放oj_server端代码- www_root
- src
- www_root
- compile_server
存放compile_server端代码
示例
编译服务器
- 在线服务器将用户需要进行判断的代码通过
RPC
交给后端的判题服务器 - 判题服务器将获得的代码交给
compiler_runner
类,来执行代码的编译和运行的功能 compile_runner
分别将代码先交给compile
类,进行代码的编译,生成一个可执行文件compile_runner
再将生成的可执行文件交给runne
r类,来进行代码的运行,并将结果通过重定向
生成临时文件
的方式层层递进,同时服务器也会生成相应的日志
,反馈给用户
使用层状结构,实现代码之间的 解耦
,低耦合,高类聚
判题服务器一经上线,就会发出
http请求
申请加入到一致性hash类的机器中,供在线服务器进行选择,实现负载均衡
在线服务器
- 获得首页的首页
- 获得网页的题目列表
- 用户的登陆,注册,题库的增删改查
- 题目的编译运行
在线服务器使用了 MVC
架构
请求服务的编译运行功能就需要用到 负载均衡
模块
使用一致性hash算法来实现负载均衡的选择(添加虚拟节点,解决请求分布不均匀的问题)
数据库
MySQL图表
提前加载进可供选择的后端编译机器
ip | port |
---|
题目信息
题号 | 标题 | 难度 | 题目表述 | 显示给用户的函数 | 测试样例 | cpu的时间限制 | 内存限制 |
---|
用户
用户名 | 密码 |
---|
Redis
使用HASH来缓存注册用户信息
key:user:username
filed | value |
---|---|
username | |
password |
同时使用布隆过滤器
将注册过的用户数据缓存起来,避免Redis的缓存穿透
RPC
使用C++14
基于ZeroMQ
实现的一个RPC框架
Buffer类
:字符数组,存储网络发送有效的数据
Serializer类
:将用户的数据进行一个序列化,符合计算机的字节序列
rpc类
:实现客户端和服务器的通信功能
使用map
来将用户需要执行的函数名(string)
和对应的函数(function)
进行绑定