type
status
date
slug
summary
tags
category
icon
password

零.利益相关

一句话:和 HydroOJ 官方 没有半毛钱关系,以下是我自己的理解。

一.关于 HydroOJ 的简介

是什么?

一个很好用的 OJ,功能强大,对比起其他开源的 OJ,优点多多:
  1. 模块化设计,自定义部署十分方便
  1. 插件系统,自定义功能十分方便
  1. 社区活跃,维护力量强大,更新及时
  1. 支持多种题目,功能强大
  1. 还有好多……

上链接

二.架构分析

总的来说,有两部分 backend(后端) 与 judge(评测机) :
backend:主进程、数据库、储存
judge:副进程、sandbox(评测沙盒)

最精简的架构

如图所示,系统核心组件(即最精简)只有二/三/四个组件:
  • 主进程(内置了评测机,可关闭):负责协调,以及提供web服务
  • 内置评测机:副进程以插件形式内置在主进程中,由此可见 HydroOJ 插件系统的强大,特别说明:内置评测机无需副进程,只需sandbox。
  • 本地数据库:MongoDB数据库,储存各种数据
  • 本地储存:本地模式下,就是把文件放在一个文件夹里,没有额外软件。似乎只储存题目的测试数据

基本模式

如图所示,箭头方向代表网络访问方向,系统组件也就那些:
  • 主进程(内置了评测机,可关闭):负责协调,以及提供web服务
  • 内置评测机:副进程以插件形式内置在主进程中,只需sandbox。
  • 数据库:MongoDB数据库
  • 储存:本地模式下,就是把文件放在一个文件夹里,没有额外软件。当然,还有个 S3 模式,可以把各种支持 S3 协议的东西作为储存
  • 额外评测机:顾名思义。额外评测机由两个组件构成:副进程、sandbox(评测沙盒)
不过看完后有没有感到奇怪:为什么是评测机访问主进程
这就是 HydroOJ 的智慧了。
HydroOJ 采用的是被动评测(我自创的“术语”),即是由评测机找主进程领取评测任务,而非主进程分发。
在实际操作中,评测机通过一个有评测权限的账号到主进程的web界面领取任务。
这种方式优点多多:
  1. 评测机与主进程无需在一个局域网下。也就是说,你的设备能访问主进程的web界面(比如 https://hydro.ac ),就可以作为评测机。这样的话,评测机扩展性非常强,实际操作中甚至可以用脚本实时扩展评测机
  1. 评测机无需额外配置。也就是说,装好一台评测机后,无需手动同步数据
比起其它 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。

四.总结

为了防止一篇太长(不想写了),而且架构也分析的差不多了,这篇就到此为止了。