분석 워커가 큐를 집어 갑니다
S3에 영상이 올라와도 아무 일이 안 일어나던 구간 (미결 ho 17번)의 나머지 절반을 만들었습니다. 백엔드 쪽(claim·PATCH)은 정어진 님이 09-04에 냈고 (미결 jin 18번), GPU 인스턴스에서 도는 폴링 루프가 비어 있었습니다.
POST /videos ──> analysis_job(queued) ← 백엔드
워커가 45초마다 ─> claim ─> analyze_s3.py ─> PATCH(succeeded|failed)
└────── 이번에 만든 것 ──────┘
videos/와 reports/를 비교하는 방식이 아니라 백엔드 큐를 폴링합니다. 인스턴스가 꺼져 있어도 큐가 안전하게 쌓이고, 재시작마다 바뀌는 퍼블릭 IP에 아무것도 걸려 있지 않습니다.
🔴 만들다가 나온 것 — 실패가 성공으로 보고될 뻔했습니다
워커는 종료 코드 하나로 succeeded와 failed를 가릅니다. 그런데 제가 09-04에 “영상 한 편을 주면 품질 게이트에서 SystemExit(2)가 그대로 올라간다”고 적어 드린 것이 사실이 아니었습니다.
analyze_s3.py의 루프가 SystemExit를 편수와 상관없이 삼키고 있어서 한 편짜리 호출도 종료 코드가 0이었습니다. 주석은 “그대로 올라간다”고 말하고 있었는데 코드가 달랐고, 저는 그 주석을 읽고 위 문장을 썼습니다.
그대로 붙였다면 품질 게이트에 걸려 리포트가 없는 분석이 전부 succeeded로 올라갔을 것입니다. 큐는 줄어드는데 결과가 없고, 화면에는 아무 표시도 남지 않습니다 — 나중에 “왜 결과가 없지”부터 시작해야 하는 종류입니다.
고쳤고(한 편이면 올리고, 접두사 스캔은 지금처럼 0), 되살아나지 못하게 검사를 두 개 붙였습니다. 고치기 전 코드에 실제로 걸리는지도 확인했습니다 — 안 걸리는 검사는 검사가 아니라서요.
부탁받은 것을 하나 다르게 했습니다
정어진 님이 두 곳에 “새 워커 이름을 BUSY_PATTERN에 추가해 주세요”라고 적어 주셨습니다. 자동 종료 타이머가 “작업 중”으로 보는 패턴이고, 안 넣으면 분석 도중에 인스턴스가 꺼진다는 이유였습니다.
넣지 않았습니다. 넣으면 반대쪽이 깨지기 때문입니다 — 워커는 큐가 비어 있는 동안에도 계속 떠 있어서, 패턴에 넣으면 인스턴스가 영영 안 꺼집니다. 상시 가동은 월 $466이고, 그건 같은 항목의 「다」에서 비싸다고 적으신 그 값입니다.
지켜야 할 성질은 “분석 도중에 꺼지지 않는다”이고, 그건 워커가 analyze_s3.py를 별도 프로세스로 부르기 때문에 이미 만족합니다. 자식이 기존 패턴에 그대로 걸립니다. 양쪽을 검사로 고정해 두었습니다 — 분석 중에는 걸리고, 폴링 중에는 안 걸리고.
지금 상태
| 코드 | agent/scripts/worker.py · deploy/supersub-worker.service · deploy/worker.env.example |
| 설치 순서 | agent/deploy/README.md 6-4절 |
| 검사 | 30건 추가, 전체 248 통과 |
| EC2 설치 | 🔴 아직입니다 — WORKER_TOKEN 값을 받아야 합니다 |
값이 없으면 워커는 아예 시작하지 않고 systemd도 재시작하지 않습니다. 저널이 401로 차는 것보다 멈춰 서서 이유를 말하는 편이 낫다고 봤습니다.
적재(POST /analyses)까지 이어지려면 미결 jin 1번 (적재 규격, 담당이 저입니다)이 먼저입니다 — metric_definition이 비어 있으면 외래키에서 전부 거부됩니다. 그때까지 산출물은 reports/의 JSON이고, 그것만으로도 “올리면 결과가 나온다”는 보여집니다. 그쪽이 다음 차례입니다.