后端、Celery、评测端的关系
- 在大多数场景下,仅后端即可完成工作,当且仅当用户提交代码时,必须运行 Celery 和评测端才能对提交进行评测。
- 后端是唯一与用户直接交互的程序,而 Celery 和评测端都是间接交互:
- 提交代码时,后端会在 RabbitMQ 中创建评测任务。
- Celery 从 RabbitMQ 中获取评测任务,将任务信息通过 WebSocket 发送给评测端。
- 评测端运行代码并进行评测,实时将每个测试点的返回数据通过 WebSocket 发送给 Celery,Celery 会保存用户的输出文件保存到
SUBMISSION_ROOT设置的路径中以便用户查询,这一点的具体机制详见“测试点和评测数据的保存”。 - 所有测试点运行完毕后,评测端将计算出总分和每个测试点的状态并发送给 Celery,Celery 将它们存储在数据库中。
- 评测端与后端程序以及 Celery 的交互仅限于读取评测数据和 WebSocket,即评测端不会操作数据库。
- 将评测端独立而非集成到 Celery 中,是为了保证后端数据的安全性(数据隔离),以及方便未来评测端做分布式部署。