Skip to content

Latest commit

 

History

History
45 lines (34 loc) · 1.44 KB

File metadata and controls

45 lines (34 loc) · 1.44 KB

S3 服务

S3 服务模块负责处理文件相关的需求,第二代架构利用 S3 (实际上是 minio 等兼容 S3 API 的文件服务) 存储了很多种文件。

OJ 目前使用 minio 作为 S3 服务的后端。

储存的文件数据

  • oj-problems: 存储题目 zip 及相关数据
    • $problem_id.zip: 题目 zip
    • plans/$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 的扩展)