- 일단 채점 서버 자체를 EC2 위에 올릴 순 없다. 외부 모니터링도 문제가 되고, 멀티 서버 돌릴 때 (그 날이 과연 오긴 올까)
- 아마존 EC2 쓰면 스케일링이 쉬워진다. 그냥 서버 더 열어달라고 하면 됨~ :-) 인스턴스간에 CPU 파워가 대략 일정하니 time limit consistency 문제도 어느정도 해결된다.
- 원래 생각했던 것처럼 채점서버별로 스레드를 하나씩 돌려서 producer-consumer 모델로 구현. 단 GIL 이 무서우니 multiprocessing 패키지를 써서 별개의 프로세스로.
- SQLite 에 멀티프로세스에서 액세스하면 매우 귀찮음. (그렇다고 MySQL 쓰긴 싫다 -_ -;) 그냥 db 접근하는 것은 메인 프로세스로 한정하자.
- Notification 프로세스는 지금과 같은 형태로. 3번 연속 실패하면 3분 쉬었다가 다시 하는 식.
- 로깅에 이메일 보내주는 기능을 추가해서, 1) 서버가 맛이 가서 재부팅했다 2) 웹서버 접근에 실패했다 등등의 오류가 발생했을 때 나한테 이메일 보내는 것으로.. 'ㅅ'
채점서버 프로세스는:
- 큐에서 작업을 받는다
- 아마존에 소스코드 보내서 컴파일 & 실행. 시간 제한 + 5초가 흐르도록 답이 없으면 인스턴스 강제 리셋하고 런타임 에러 보낸다.
- 서버가 시작된지 55분이 되면 마지막 20분 동안 서브미션이 없었나 확인하고 없으면 서버
이걸 위해 할 수 있어야 하는 일은
- EBS Snapshot 으로부터 새 인스턴스를 얻고 핸들을 반환받음
- 인스턴스에 원격으로 명령 내려서 실행 / 결과 넘겨받기 (이거 그냥 ssh 로 해서 표준출력 받아와야 하나.. 사실 그게 제일 간단하긴 함...)
- 인스턴스 리셋
이런걸 하려면 Python API 를 쓰면 좋으나.. 버전 따라가기도 귀찮고.. 그냥 아마존에서 나오는 커맨드라인 유틸리티를 쓴다. 스냅샷 내에는 이런 스크립트를 만들어 둬야겠군:
- 답안 번호, 문제번호를 넘겨받고 웹서버에 접근해서 소스코드와 채점 데이터, 채점 스크립트를 가져옴 (30초 갭을 두고 3회 연속 실패시에는 별도의 오류 결과로 끝)
- 알아서 적당히 잘 컴파일 해주는 스크립트
- 알아서 잘 실행해 주고 채점해 주는 스크립트
EBS Snapshot 을 만들 때는
- 프로그램 실행하는 데 사용할 계정 만들고 (가능하면 chroot jail 에 넣음)
- 각종 컴파일러 깔아두고
- 해당 사용자에게 네트워크 액세스 막고...
이렇게 하면 좀 되려나?


