# Judge **Repository Path**: ankigaokao/Judge ## Basic Information - **Project Name**: Judge - **Description**: Judge system for web - **Primary Language**: Unknown - **License**: GPL-3.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2021-03-15 - **Last Updated**: 2021-06-07 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Judge服务器 原项目地址:https://github.com/syzoj/judge-v3 * Judge服务器与Web服务器分离架构,其中web服务器提供数据库,网页访问等基本的网页服务器功能,而Judge服务器负责在沙盒中编译并运行用户提交的代码,并判断用户的代码是否正确。 * 在实际使用的过程中,用户代码的编译和运行是一个非常耗时的工作,为了缓解服务器的压力,需要使用分布式的架构,即一台Web服务器可以配备多台Judge服务器。使用消息队列完成多个服务器之间的任务调度功能。 ## 1.评测机的结构 评测机分为两个不同的部分:Judge Daemon以及Judge Runner。 Judge Daemon:直接与web服务器之间进行通信,这里的通信直接采用socket协议,实现双边的单对单通信,获取服务器发送给评测机的任务以及及时返回评测机的评测结果给服务器。同时Judge Daemon还负责将一个评测任务分解为多个不同的阶段任务,包括编译和运行。其中编译将不同的语言代码编译为能够直接运行的二进制文件。 Judge Runner:实现具体的细分任务,比如编译、标准测试、交互测试等。 为了更好的理解Judge Daemon和Judge Runner请继续阅读下一章节。 ## 2.RabbitMQ 如果你需要进一步开发的话,非常建议你阅读官方手册:https://www.rabbitmq.com/ 如果你只是单纯的使用,那么你可以简单地将其理解为一个大的队列,任务的发布者从一端输入任务,任务的执行者从另一端取出任务,这样就实现了任务的发布者和消费者之间的通信,任务的发布者只用将任务放进队列即可,无需关心任务的具体执行方法。但是这样存在的问题是,队列是一个单向的数据结构,所以为了获得任务执行的具体结果,我们还需要反向建立一个队列返回任务执行的结果。