현재 채점 도커 컨테이너 하나만 띄워 채점을 진행하고 있음
또한 매 채점을 시작하기 전에 docker build
를 매번 실행한 후 채점을 진행하여 이미지를 빌드하는데 시간이 오래 걸림.
⇒ 채점 결과를 받는데까지 시간이 상당히 걸림
채점 서버 내부에서 cron으로 매초마다 큐에 채점이 들어있는지 없는지를 지속적으로 확인하는 작업을 하고 있음
제출을 저장하고 받은 submissionId를 채점 서버로 API 요청을 보낸다.
채점 서버는 받은 submissionId를 채점 서버 내부 채점 큐에 넣는다.
채점 서버 내부에서는 cron을 매초마다 돌리고 있다.
@Cron('* * * * * *')
async handleCron() {
if (this.isReady && this.queue.length > 0) {
this.isReady = false;
const submissionId = this.queue.shift();
await this.createSubmission(submissionId);
}
}
isReady
: 채점 도커 컨테이너 채점 진행 여부createSubmission
은 DB의 일부 table에 readonly로 접근가능하다.
submissionId
로 DB에 접근하여 테스트케이스, 언어, 제출 코드, 문제 메모리 및 시간 제한 정보를 가져온다.Promise
로 파일로 저장한다.Promise
로 docker run
시킨다.Promise
로 위에서 파일로 저장한 내용을 모두 복사하여 넣는다.docker exec
명령어를 사용하여 도커 컨테이너 내부 채점 프로그램을 비동기적으로 실행하여 채점을 한다.
data
이벤트를 실행시켜 채점이 끝난 것을 감지할 수 있다..dockerignore
추가 ⇒ deploy시에 build 한 번만 하도록 변경