type
status
date
slug
summary
tags
category
icon
password
零.利益相关
一句话:和 HydroOJ 官方 没有半毛钱关系,以下是我自己的理解。
一.关于 HydroOJ 的简介
是什么?
一个很好用的 OJ,功能强大,对比起其他开源的 OJ,优点多多:
- 模块化设计,自定义部署十分方便
- 插件系统,自定义功能十分方便
- 社区活跃,维护力量强大,更新及时
- 支持多种题目,功能强大
- 还有好多……
上链接
二.架构分析
总的来说,有两部分 backend(后端) 与 judge(评测机) :
backend:主进程、数据库、储存
judge:副进程、sandbox(评测沙盒)
最精简的架构
如图所示,系统核心组件(即最精简)只有二/三/四个组件:
- 主进程(内置了评测机,可关闭):负责协调,以及提供web服务
- 内置评测机:副进程以插件形式内置在主进程中,由此可见 HydroOJ 插件系统的强大,特别说明:内置评测机无需副进程,只需sandbox。
- 本地数据库:MongoDB数据库,储存各种数据
- 本地储存:本地模式下,就是把文件放在一个文件夹里,没有额外软件。似乎只储存题目的测试数据
基本模式
如图所示,箭头方向代表网络访问方向,系统组件也就那些:
- 主进程(内置了评测机,可关闭):负责协调,以及提供web服务
- 内置评测机:副进程以插件形式内置在主进程中,只需sandbox。
- 数据库:MongoDB数据库
- 储存:本地模式下,就是把文件放在一个文件夹里,没有额外软件。当然,还有个 S3 模式,可以把各种支持 S3 协议的东西作为储存
- 额外评测机:顾名思义。额外评测机由两个组件构成:副进程、sandbox(评测沙盒)
不过看完后有没有感到奇怪:为什么是评测机访问主进程?
这就是 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的账号。
这种东西属于管理套件,实际操作上因人而异,这里就不多说了。
三.系统选择
Hydro 支持所有主流的 Linux 发行版,兼容 x86_64 和 arm64 架构设备,且均可一键安装。Hydro 可在 树莓派 或是 Apple M1/M2 上正常运行。
官方推荐 Debian 和 Ubuntu ;不推荐(原文是不支持)CentOS及其变种,我也没试过CentOS,想必应该可以运行;还原生支持 Alpine ,也支持 NixOS,官方站的评测机就是 Alpine 和 NixOS 的,不过这两个系统上手难度较大;据说还支持 树莓派 和 Apple M1/M2,不过没试过。
总结一下,支持64位的Linux系统,无论是 amd64 还是 arm64 都支持,还支持 树莓派 和Apple M1/M2 。不过32位系统就不知道了,不过 armv7l 我试过了不支持。
推荐?Ubuntu 适合新手,简单而且人性化,但系统占用相对较高(其实也无伤大雅);Debian 系统占用低,适合低配机器,但上手难度比起 Ubuntu 高一点。至于 Alpine ,very good,官方的安装脚本可以直接用。 NixOS,高级玩家才选,太吃操作了,请看:事务1010。树莓派?个人玩家。Apple M1/M2 ?什么东西啊。Windows?要么 WSL,要么 Docker,相当于绕一圈用 Linux。
四.总结
为了防止一篇太长(不想写了),而且架构也分析的差不多了,这篇就到此为止了。