type
status
date
slug
summary
tags
category
icon
password
一.关于 HydroOJ 的简介
是什么?
一个很好用的 OJ,功能强大,对比起其他开源的 OJ,优点多多:
- 模块化设计,自定义部署十分方便
- 插件系统,自定义功能十分方便
- 社区活跃,维护力量强大,更新及时
- 支持多种题目,功能强大
- 还有好多……
上链接
二.架构分析
最精简的架构
如图所示,系统核心组件(即最精简)只有二/三/四个组件:
- 主进程(内置了评测机,可关闭):负责协调,以及提供web服务
- 内置评测机:以插件形式内置在主进程中,由此可见 HydroOJ 插件系统的强大
- 本地数据库:MongoDB数据库,储存各种数据
- 本地储存:本地模式下,就是把文件放在一个文件夹里,没有额外软件。似乎只储存题目的测试数据
基本模式
如图所示,箭头方向代表网络访问方向,系统组件也就那些:
- 主进程(内置了评测机,可关闭):负责协调,以及提供web服务
- 内置评测机:以插件形式内置在主进程中
- 数据库:MongoDB数据库
- 储存:本地模式下,就是把文件放在一个文件夹里,没有额外软件。当然,还有个 S3 模式,可以把各种支持 S3 协议的东西作为储存
- 额外评测机:顾名思义。额外评测机也不需要其他组件,最多在本地(指额外评测机)目录下有个缓存测试数据的文件夹
不过看完后有没有感到奇怪:为什么是评测机访问主进程?
这就是 HydroOJ 的智慧了。
HydroOJ 采用的是被动评测(我自创的“术语”),即是由评测机找主进程领取评测任务,而非主进程分发。
在实际操作中,评测机通过一个有评测权限的账号到主进程的web界面领取任务。
这种方式优点多多:
- 评测机与主进程无需在一个局域网下。也就是说,你的设备能访问主进程的web界面(比如 https://hydro.ac ),就可以作为评测机。这样的话,评测机扩展性非常强,实际操作中甚至可以用脚本实时扩展评测机
- 评测机无需额外配置。也就是说,装好一台评测机后,无需手动同步数据
比起其它 OJ 的评测机和主进程焊死的做法,嗯,高下立见。
额外组件
远端评测是什么?我没听过
远端评测,一种新东西,在 HydroOJ 中主要以插件形式出现(我也没见过别的形式),简单来说,爬取其它 OJ 的题装到自己题库里(实际只爬取了题面),然后有人交的话会交到源站(上文的其它 OJ )进行评测,再爬取结果,最后进行相关处理(比如展示结果、入库)。
实际操作上,也可以在自己的 OJ 里评测,不过要有测试数据。
主要有:一本通题库、洛谷深入浅出基本篇
当然,官方也有与洛谷合作,有个项目:
洛谷远端评测为洛谷开放平台收费项目, HydroOJ 作为首批接入洛谷开放平台的在线评测系统,实现了完整的远程评测体验,您可以在 Hydro 中导入洛谷全部题目,定期更新,复制题目,编辑题面,发起评测和接收所有的子评测详细结果,享受洛谷所有题目评测。详情请联系 kkksc03 或联系 undefined 或加入 QQ 群(1085853538)了解详情。
Caddy?嘛玩意
Caddy,HydroOJ默认的反向代理工具,和 Nginx 差不多,上下限极宽:
- 会玩:负载均衡、容灾处理
- 不会玩:反代……(把 8888 端口转发到 80 端口)
这种东西属于网络套件,实际操作上因人而异,可选的也很多,这里就不多说了。
PM2?图表里没有啊
PM2 / pm2,HydroOJ默认的进程管理工具,挺好用,还能连接pm2的账号。
这种东西属于管理套件,实际操作上因人而异,这里就不多说了。
三.总结
为了防止一篇太长(不想写了),而且架构也分析的差不多了,这篇就到此为止了。