type
status
date
slug
summary
tags
category
icon
password

一.关于 HydroOJ 的简介

是什么?

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

上链接

二.架构分析

最精简的架构

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

基本模式

如图所示,箭头方向代表网络访问方向,系统组件也就那些:
  • 主进程(内置了评测机,可关闭):负责协调,以及提供web服务
  • 内置评测机:以插件形式内置在主进程中
  • 数据库:MongoDB数据库
  • 储存:本地模式下,就是把文件放在一个文件夹里,没有额外软件。当然,还有个 S3 模式,可以把各种支持 S3 协议的东西作为储存
  • 额外评测机:顾名思义。额外评测机也不需要其他组件,最多在本地(指额外评测机)目录下有个缓存测试数据的文件夹
不过看完后有没有感到奇怪:为什么是评测机访问主进程
这就是 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的账号。
这种东西属于管理套件,实际操作上因人而异,这里就不多说了。

三.总结

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