文件管理
总述
项目的文件传输使用了七牛云的云存储服务,它每个月都有几十 G 的免费用量。未来也会增加自定义的传输方案。
使用其他方式
如果你想使用服务端传输/其他平台服务,可能需要进行二次开发,主要需要修改主服务器的相关代码,对其他代码影响不大。
项目的以下功能依赖了文件传输服务:
- 所有的测试样例
- 用户的头像
- 网站里面的一些图片(可选,默认放在本地)
对于测试样例
主服务器在接收到提交之后,会将标准输入地址、标准输出地址(由管理员编辑上传)传给判题服务器,判题服务器会下载这些资源,然后执行判题。
为什么不是
服务端提供文件托管功能
有些题目的测试样例体积还是有点大的(大概几 MB 甚至十几 MB),如果通过服务端存储文件,除非有优秀的带宽,否则就像我使用的学生机,几十 KB 每秒的速度...
将测试样例直接放于本地管理
个人觉得,有以下缺点:
- 判题服务器无法实现开箱即用的特性,部署时还要去移动测试样例到判题服务器上,对于多服务器的部署我们还得保证测试样例的测试点数据同步,实在捉襟见肘。
- 和主服务器耦合度更高了,判题服务器还要和主服务器约定获取测试样例的数据结构...
如果有十次提交都是同一道题目,那么判题服务器还要从资源服务器下载十次重复的测试样例?
不会,只会下载一次,判题服务器使用了 redis 来存放【远程资源链接--本地文件】的关系,每次接受提交之后他会查询这次提交的资源是否在本地存在,如果存在直接读本地资源,而且这些数据(redis 数据、下载的资源)是可以持久化的(docker 的文件挂载),存放在【项目工作目录】中,一般无需打理,哪怕你重启 docker,redis 数据、下载的资源也不会丢失