OnPyRunner 회고: 프로젝트를 돌아보며
첫 프로젝트 OnPyRunner의 10편 시리즈를 돌아보며, 당시의 판단과 실수를 현재의 관점에서 분석하고, 이 프로젝트를 통해 체득한 엔지니어링 원칙을 정리했습니다.
첫 프로젝트 OnPyRunner의 10편 시리즈를 돌아보며, 당시의 판단과 실수를 현재의 관점에서 분석하고, 이 프로젝트를 통해 체득한 엔지니어링 원칙을 정리했습니다.
무한 출력 이슈를 해결하다 파이프 데드락 문제를 발견하여, 원인 분석부터 해결까지의 과정을 기록하였습니다.
rlimit과 cgroup의 차이를 서술한 글입니다.
전체 실행 흐름을 시퀀스 다이어그램으로 정리하고, UI를 제작한 뒤 run.ljweel.dev로 서비스를 오픈했습니다.
docker compose watch로 개발 루프를 자동화하고, cgroup v2의 no internal processes rule을 이해하여 fork bomb 방지했습니다.
Worker가 Queue에서 Job을 가져와 Nsjail로 실행하고 결과를 분석하는 전체 흐름을 설계하며, NsjailResult를 통한 추상화를 구현했습니다.
PENDING·RUNNING·COMPLETED·FAILED 상태 다이어그램을 정의하고, 각 API의 요청·응답 구조와 의사코드를 설계했습니다.
Redis는 비동기를 위한 도구가 아니라 Job의 생명주기를 HTTP 요청에서 분리하기 위한 장치임을 깨닫고, 웹-큐-워커 아키텍처로 정했습니다.
로컬 우분투에서의 nsjail 디버깅 지옥을 겪은 뒤 Docker를 도입하여 일관된 개발 환경을 구축하고, clone_newns 이슈를 해결했습니다.
신뢰할 수 없는 코드 실행을 위해 Nsjail을 도입하고, runCode 함수에 대한 테스트 케이스를 작성하며 첫 샌드박스 실행에 성공했습니다.