S3 服务模块负责处理文件相关的需求,第二代架构利用 S3 (实际上是 minio 等兼容 S3 API 的文件服务) 存储了很多种文件。
OJ 目前使用 minio 作为 S3 服务的后端。
oj-problems: 存储题目 zip 及相关数据$problem_id.zip: 题目 zipplans/$problem_id.json: scheduler2 的评测计划 (参见Scheduler2 模块)$problem_id/$file: 题目所属的输入/输出/spj/其他文件
oj-images: 图床 (开放读, 私有写)- 图片直接存储
oj-attachments: 题目附件oj-submissions: 存储提交的代码$submission_id.code: 提交的代码
oj-artifacts:$submission_id/main.{cpp,v}: 提交的代码 (也有可能叫其他文件名, 例如 src.hpp 或者 answer.v)$submission_id/main: 编译出的二进制文件
有的文件太大了,数据库不是给存这么大的文件设计的,而 S3 是一个专门用来存文件的服务; 而且存到 S3 之后, 很多场景下只需要传一个 url 就可以了, 不用传完整的文件。
因为 S3 API 自带:
- 访问控制
- 缓存
- 细粒度授权
- 公网访问
- 直接从用户端 (管理员侧) 上传/下载
- Python 库 (e.g. 多线程传输)
- 版本管理
以后可能还会用到:
- 由 S3 提供的现场 zip 解压 (minio 的扩展)