"한 호스트는 결정해. 한 호스트는 실행해. 일부러 같은 호스트가 아냐."
네 개의 역할, 네 개의 동료가 아니라
Recall 의 일은 기계들에 퍼져 있지만, 그 분리는 '속도 위해 컴퓨터 더' 가 아냐. 각 역할은 뭘 소유하도록 허락받았는지로 정의돼:
- control plane — 항상 켜진 호스트 하나. 데이터베이스, job queue, 받아들인 증거, 그리고 모든 상태 전이를 소유해. 단일 진실의 원천이야. 얘가 job 끝났다고 하면, 끝난 거야.
- executor — 또 다른 항상 켜진 호스트. 아카이브를 스캔하고, 오디오를 트랜스코딩하고, 유료 전사 API 를 불러. canonical 상태는 하나도 소유 안 해. 로컬 파일은 캐시야: 재구축 가능, 버릴 수 있음, 절대 진실 아님.
- 스토리지(NAS) — 원본 영상 바이트를 소유해. 아무도 그걸 DB 로 복사 안 해.
- 개발 client(노트북) — 코드 편집하고, 작은 테스트 돌리고, git 에 push 해. job 을 소유한 적도 없고 무거운 아카이브 일을 돌린 적도 없어.
이것들이 교체 가능한 동료가 아니라는 걸 봐. 다른 권리를 가진 역할들이고, 그 권리가 곧 아키텍처야.
왜 결정과 실행을 분리해
executor 의 일은 느리고, 비싸고, 실패하기 쉬운 전부야: hang 걸릴 수 있는 네트워크 파일시스템, 트랜스코딩할 몇 기가짜리 영상, 타임아웃 날 수 있는 유료 API 호출. 그건 정확히 진실의 원천에 융합하고 싶지 않은 종류의 일이야. 융합하면 멈춘 네트워크 마운트 하나가 DB 를 얼리고, 트랜스코딩 중 크래시 하나가 queue 를 오염시켜.
분리하면 blast radius 가 줄어. executor 는 job 중에 크래시하거나, hang 걸리거나, 죽어도 돼 — control plane 의 진실은 멀쩡해, executor 는 애초에 진실을 쓸 권한이 없었으니까. 결과를 제안만 할 수 있고, control plane 이 받거나 거절해. 두뇌랑 손을 생각해: 손이 위험한 일을 하지만, 뭐가 실제로 일어났는지는 두뇌가 정해.
executor 는 진실이 아니라 lease 를 쥐어
구체적으로: executor 는 파일을 소유하듯 job 을 '가진' 게 아냐. control plane 에서 하나 claim 하고, 시간 제한 lease 아래 작업하고, 결과를 수락받으려고 도로 제출해. 죽으면 lease 가 만료되고 control plane 이 job 을 딴 애한테 넘겨. 아무것도 안 잃어, executor 는 중요한 걸 쥔 적이 없으니까. 트랙 6 전체가 그 lease 가 어떻게 도는지야. 지금은 모양만 붙잡아: 무거운 일은 아무것도 소유 안 하는 호스트에 살아.