본문 바로가기
C.W.K.
Lesson 05 of 07 · published

워커에게 일을 임대하는 컨트롤 플레인

~12 min · fleet, control-plane, worker, lease, single-writer, measured

Level 0스펙 시트 훑는 사람
0 XP0/91 lessons0/19 achievements
0/100 XP to next level100 XP to go0% complete
"512 GB Studio가 진실을 소유하고, 192 GB Studio가 일을 하고, 그 사이엔 만료가 있는 임대 하나뿐이야. 4,900개 작업 뒤에 반쯤 쓰인 건 하나도 없어."

패턴

영상 기억 엔진은 이 집의 필름 아카이브를 검색 가능하게 유지해. 미디어 라이브러리를 목록화하고, 모든 영상을 전사하고, 전사본을 요약해. 그 아키텍처는 함대의 용량을 따라 갈라져. office가 컨트롤 플레인이야. 애플리케이션, 큐, 그리고 데이터베이스를 쓸 수 있는 유일한 프로세스를 들고 있어. worker, 192 GB M2 Ultra는 라이브러리를 스캔하고, 트랜스코더를 돌리고, 오디오를 전사 제공자에 제출해. 둘 사이의 악수가 임대야. 워커가 일을 요청하면 컨트롤 플레인이 워커의 이름, 토큰, 만료로 표시하고, 워커가 하고 결과를 돌려주고, 결과는 컨트롤 플레인이 받아들일 때만 셈에 들어가. 워커가 작업 중에 죽으면 임대가 만료되고 일은 다시 제안돼. 워커가 컨트롤 플레인이 거부하는 걸 돌려주면 아무것도 기록되지 않아. 2026-09-15에 직접, 읽기 전용으로 읽음: 전사 작업 4,927, 완료 4,921, 실패 6, 열린 임대 0, 영상 2,546, 전사 세그먼트 3,011,560. 같은 패턴이 엔진은 office에 두고 가져오기 워커는 아카이브 옆에 둔 모델 저장소를 돌리고, office에서 ssh로 모든 맥을 모는 함대 제어 도구를 돌려.

쓰기 주체가 하나인 이유

단일 쓰기 주체 규칙은 함대의 가장 중요하고 가장 안 보이는 불변량이야. 모든 이 집 엔진의 데이터베이스엔 정확히 맥 하나에서 그걸 쓰는 프로세스가 정확히 하나 있고, 다른 모든 맥의 모든 명령줄 도구는 그 프로세스에 묻는 API 클라이언트야. 그래서 office의 서비스 수가 다른 어떤 기계의 여섯 배고, 워커는 생각 없이 재부팅할 수 있고, 이 퀘스트를 만든 퀘스트 작업장은 그 엔진이 office에서 모든 단계를 기록하는 동안 노트북에서 몰 수 있었어. 이 규칙은 쓰기당 네트워크 왕복 하나를 치르고, 아홉 기계의 함대라면 매주 만날 버그 부류 하나 전체, 프로세스 둘이 행 하나에 대해 어긋나는 것의 부재를 사.

요약 칸이 말하는 것

큐의 요약 테이블은 선택으로 클라우드 레슨을 미리 실어. 2,463개 요약 하나하나가 허브 자체의 데몬을 통해 요청됐고(서버 별칭 칸에 값이 하나야), 그중 2,462개가 그 데몬의 클라우드 계층을 통해 클라우드 모델에서 돌았어. 하나는 로컬 31B에서. 컨트롤 플레인이 로컬을 안 고른 건 기계가 못 해서가 아니야. 허브는 bf16의 31B를 들고 있고 풀은 훨씬 큰 것도 돌릴 수 있어. 요약기에 클라우드 계층을 고른 건 프론티어 모델이 요약을 더 잘하고 데몬이 계층을 설정으로 만들기 때문이야. 함대 전체가 칸 하나에 있어. 로컬 컨트롤 플레인, 로컬 워커, 그 워커가 클라우드에서 받아 온 전사본과 요약, 그리고 실리콘이 어디 있느냐가 아니라 품질로 고른 모델 계층.

Code

lease.py — 읽기 전용으로 센 큐: 작업, 임대, 요약이 돈 자리·python
#!/usr/bin/env python3
"""A control plane leasing work to a worker: the queue counted, read-only. The control
plane on office keeps the only writer; a worker takes a lease with a token and an expiry
and the result counts only when the control plane accepts it. Path from the environment."""
import os, sqlite3
con = sqlite3.connect(f"file:{os.environ['RECALL_DB']}?mode=ro", uri=True)
con.execute("PRAGMA query_only=ON")
print("jobs by kind and status:", con.execute("select kind, status, count(*) from jobs group by kind, status order by kind, status").fetchall())
print("open leases:             ", con.execute("select lease_owner, count(*) from jobs where lease_owner is not null group by lease_owner").fetchall())
print("summaries by model:      ", con.execute("select model, count(*) from summary_jobs group by model order by 2 desc").fetchall())
print("summaries by daemon host:", con.execute("select server_alias, count(*) from summary_jobs group by server_alias").fetchall())
print("corpus:                  ", con.execute("select count(*) from videos").fetchone()[0], "videos,",
      con.execute("select count(*) from transcript_segments").fetchone()[0], "transcript segments")
# office, 2026-09-15:
# jobs by kind and status: [('transcribe', 'completed', 4921), ('transcribe', 'failed', 6)]
# open leases:              []
# summaries by model:       [('glm-5.2:cloud', 2436), ('glm-5.3:cloud', 12), ('kimi-k3:cloud', 10), ('deepseek-v4.1-flash:cloud', 4), ('gemma4:31b-it-qat', 1)]
# summaries by daemon host: [('server', 2463)]
# corpus:                   2546 videos, 3011560 transcript segments

External links

Exercise

네 설정에서 큐 하나를 찾아. 작업 테이블, 태스크 목록, 파일을 쓰는 크론. 그리고 카드에 질문 셋에 답해. 어느 단일 프로세스가 그걸 쓰는지, 임대나 클레임이 어떻게 생겼는지, 워커가 사라진 작업엔 무슨 일이 생기는지. 어느 답이든 '없음'이면 그게 고칠 행이야.
Hint
스크립트 둘이 덧붙이는 파일은 쓰기 주체 둘이야. 만료 없이 '실행 중'으로 표시된 작업은 절대 안 돌아오는 임대야. 컨트롤 플레인 패턴은 작아. 소유자 칸, 토큰, 타임스탬프, 그리고 데이터베이스 소유자만 그걸 바꾼다는 규칙.

Progress

Progress is local-only — sign in to sync across devices.
이 페이지에서 버그를 발견하셨거나 피드백이 있으세요?문제 신고

댓글 0

🔔 답글 알림 (로그인 필요)
로그인 — 댓글을 남기려면 로그인해 주세요.

아직 댓글이 없어요. 첫 댓글을 남겨보세요.