클라이언트에서 작성한 코드에 대한 제출 요청을 API 서버로 보냅니다 (웹소켓)
API 서버에서는 제출에 대한 정보를 DB에 기록합니다.
API 서버에서는 Redis message queue로 채점 요청 정보를 삽입합니다.
채점 서버에서는 message queue에서 가장 먼저 삽입되었던 메세지를 pop하여, 해당 채점 요청 정보에 해당하는 코드를 실행할 준비를 합니다.
{
submissionId: number,
problemId: number, // 필요 없음. API 서버에서 주지 않아도 됨
sessionId: number
}
submissionId
를 이용해 DB에서 제출 관련 정보를 가져옵니다.problemId
를 이용해, 문제 정보를 가져옵니다./home/be/algo-with-me/submission/
) 이하에 씁니다. 정확한 경로는 아래 링크에서 확인할 수 있습니다.
https://www.notion.so/3577b8c3a6184a728956d2c977567d25?pvs=4
제출
: /algo-with-me/submissions/
문제
: /algo-with-me/problems/
테스트케이스
: /algo-with-me/testcases/
제출
, 문제
경로만을 사용합니다. (읽기/쓰기 권한 모두 부여)제출
, 테스트케이스
, 문제
경로를 모두 사용합니다. (읽기/쓰기 권한 모두 부여)채점 서버에서는 도커 서버로 코드 실행 request를 보냅니다.
도커 서버는 제출 코드를 실행합니다.
<디렉토리>/<문제번호>.result
<디렉토리>/<문제번호>.stdout
<디렉토리>/<문제번호>.stderr
<디렉토리>/<문제번호>.time
<디렉토리>/<문제번호>.memory
채점 서버는 도커 서버의 응답을 바탕으로 채점을 시작합니다.
<문제번호>.result
파일의 값과 테스트케이스 정답 파일의 값이 일치하면 정답 처리합니다.채점 결과를 테스트 케이스 별로 API 서버에게 전송
API 서버는 채점 결과를 이용해 DB 갱신 및 websocket을 통해 테스트 케이스별 결과 전송
101.101.208.240:4000~
채점서버는 Redis 이벤트 큐에서 가져온 뒤, 도커 서버에게 코드 실행을 요청합니다. 코드 실행 결과를 통해 제출한 코드의 정답 여부를 판단한 뒤, API 서버에게 그 판단한 결과를 전송합니다.
채점서버는 Redis 이벤트 큐로부터 메세지를 스스로 받은 이후 작업들을 수행합니다. 그러므로, 외부에서 요청이 오지 않으므로 가지고 있는 API가 없습니다.