프로덕션 런타임 — Queue, Event, Cron
프로덕션 에이전트는 여섯 가지 런타임 형태(runtime shapes) 위에서 실행됩니다. 요청-응답(request-response), 스트리밍(streaming), 내구성 있는 실행(durable execution), 큐 기반 백그라운드(queue-based background), 이벤트 기반(event-driven), 스케줄 실행(scheduled)입니다. 프레임워크를 고르기 전에 실행 형태를 먼저 고르세요. 모든 형태에서 관측성(observability)은 하중을 지탱하는 구조물(load-bearing)입니다.
유형: Learn
언어: Python (stdlib)
선수 학습: Phase 14 · 13 (LangGraph), Phase 14 · 22 (Voice)
소요 시간: 약 60분
학습 목표
- 여섯 가지 프로덕션 런타임 형태를 말하고, 각 형태를 프레임워크나 제품 패턴에 매핑합니다.
- 긴 작업(long-horizon tasks)에 내구성 있는 실행(LangGraph)이 왜 중요한지 설명합니다.
- 이벤트 기반 런타임을 설명하고, Claude Managed Agents가 언제 맞는지 말합니다.
- 멀티 단계 에이전트에서 관측성이 하중을 지탱한다는 주장을 설명합니다.
문제
프로덕션 에이전트는 Jupyter notebook이 드러내지 않는 방식으로 실패합니다. 37번째 단계에서 네트워크 타임아웃(timeout)이 발생하고, 음성 통화 중 사용자가 전화를 끊고, 머신 재부팅으로 cron 작업(cron job)이 죽고, 백그라운드 워커(worker)가 메모리를 다 써버립니다. 런타임 형태는 어떤 실패가 복구 가능한지를 결정합니다.
개념
요청-응답(Request-response)
- 동기식(synchronous) HTTP입니다. 사용자는 완료를 기다립니다.
- 짧은 작업(<30초)에만 적합합니다.
- 스택은 Agno(Python + FastAPI), Mastra(TypeScript + Express/Hono/Fastify/Koa)가 있습니다.
- 관측성은 표준 HTTP 접근 로그(access log)와 OTel 스팬(span)입니다.
스트리밍(Streaming)
- 점진적 출력을 위해 SSE나 WebSocket을 사용합니다.
- LiveKit은 이를 음성/비디오용 WebRTC로 확장합니다(22강).
- 스택은 스트리밍을 지원하는 어떤 프레임워크든 가능하며, 프론트엔드(frontend)는 SSE/WS를 처리해야 합니다.
- 관측성은 청크별 시간 측정(per-chunk timing), 첫 토큰 지연(first-token latency), 꼬리 지연(tail latency)입니다.
내구성 있는 실행(Durable execution)
- 모든 단계 뒤에 상태를 체크포인트(checkpoint)로 저장하고, 실패하면 자동으로 재개합니다.
- AutoGen v0.4의 액터 모델(actor model)은 실패를 한 에이전트로 격리합니다(14강).
- LangGraph의 핵심 차별점입니다(13강).
- 단계 수를 알 수 없고 복구 비용이 높을 때 필수입니다.
큐 기반 / 백그라운드(Queue-based / background)
- 작업이 큐(queue)에 들어가면 워커(worker)가 가져가서 처리하고, 결과는 웹훅(webhook)이나 발행/구독(pub/sub)으로 돌아옵니다.
- 긴 작업(long-horizon agents)에는 필수입니다. Anthropic의 computer use 발표에 따르면 한 작업이 수십-수백 단계에 이를 수 있습니다.
- 스택은 Celery(Python), BullMQ(Node), SQS + Lambda(AWS), 커스텀(custom) 구현이 있습니다.
- 관측성은 큐 깊이(queue depth), 작업별 지연 분포, DLQ 크기입니다.
이벤트 기반(Event-driven)
- 에이전트가 새 이메일, PR 열림(PR opened), cron 발화(cron fire) 같은 트리거(trigger)를 구독합니다.
- Claude Managed Agents는 이를 기본으로 제공합니다(17강).
- CrewAI Flows(15강)는 이벤트 기반 결정론적 워크플로(workflow)를 구조화합니다.
- 관측성은 트리거 출처, 이벤트 도착에서 실행까지의 지연(event-to-start latency), 에이전트 지연입니다.
스케줄 실행(Scheduled)
- 주기적으로 실행되는 cron 형태의 에이전트입니다.
- 내구성 있는 실행과 결합하면 실패한 야간 실행(nightly run)이 다음 주기(tick)에서 재개될 수 있습니다.
- 스택은 Kubernetes CronJob + 내구성 있는 프레임워크, 또는 Render cron, Vercel cron 같은 호스팅(hosted) 옵션입니다.
2026년 배포 패턴
- CrewAI Flows는 이벤트 기반 프로덕션에 사용합니다.
- Agno는 Python 마이크로서비스(microservice)용 상태 없는(stateless) FastAPI에 적합합니다.
- Mastra는 Express, Hono, Fastify, Koa 같은 서버 어댑터(server adapter)로 다른 시스템에 임베딩(embedding)하기 좋습니다.
- Pipecat Cloud / LiveKit Cloud는 관리형(managed) 음성 처리에 적합합니다(22강).
- Claude Managed Agents는 호스팅되는 장기 실행 비동기(long-running async)에 적합합니다.
관측성은 하중을 지탱한다
OpenTelemetry GenAI 스팬(23강)과 Langfuse/Phoenix/Opik 백엔드(backend)(24강)가 없으면 40번째 단계에서 실패한 멀티 단계 에이전트를 디버깅(debugging)할 수 없습니다. 프로덕션에서는 선택 사항이 아닙니다. "빠르게 디버깅한다"와 "로그를 더 넣고 처음부터 다시 재생한다"의 차이를 만듭니다.
프로덕션 런타임이 실패하는 지점
- 잘못된 형태 선택. 5분짜리 작업에 요청-응답을 고릅니다. 사용자는 연결을 끊고, 워커는 쌓이고, 재시도는 겹칩니다.
- DLQ가 없음. 데드 레터 큐(dead-letter queue; DLQ) 없는 큐 워커는 실패한 작업을 사라지게 만듭니다.
- 불투명한 백그라운드 작업. 백그라운드 에이전트가 추적 내보내기(trace export) 없이 실행됩니다. 사용자가 신고하기 전까지 실패가 보이지 않습니다.
- 내구성 있는 상태 생략. 30초가 넘고 처음부터 다시 시작할 수 없는 모든 실행에는 내구성 있는 실행이 필요합니다.
만들어보기
code/main.py는 표준 라이브러리(stdlib)만 사용해 여러 실행 형태를 보여줍니다.
- 요청-응답 엔드포인트(endpoint)입니다. 일반 함수(plain function)로 구현했습니다.
- 스트리밍 핸들러(handler)입니다. 제너레이터(generator)를 사용합니다.
- DLQ가 있는 큐 기반 워커(worker)입니다.
- 이벤트 트리거 레지스트리(registry)입니다.
- cron 형태의 스케줄러(scheduler)입니다.
실행 방법은 다음과 같습니다.
python3 code/main.py
출력은 같은 작업에 대해 각 형태가 어떻게 동작하는지 보여주는 다섯 개의 실행 추적(trace)을 출력합니다. 같은 에이전트 로직이지만 외부 껍질이 다릅니다. 여섯 번째 형태인 내구성 있는 실행은 LangGraph 체크포인트(checkpointing)와 함께 13강에서 의도적으로 다룹니다.
사용해보기
- 요청-응답은 채팅 스타일 UX에 적합합니다.
- 스트리밍은 점진적 응답에 적합합니다.
- 내구성 있는 실행은 긴 작업에 적합합니다.
- 큐는 배치(batch), 비동기, 장기 실행에 적합합니다.
- 이벤트는 에이전트 반응성(agent reactivity)에 적합합니다.
- Cron은 유지 보수성 작업(housekeeping)에 적합합니다. 메모리 통합, 평가(eval), 비용 보고서(cost report) 작성이 예입니다.
산출물 만들기
outputs/skill-runtime-shape.md는 작업에 맞는 런타임 형태를 고르고 관측성 요구사항을 연결합니다.
연습문제
- 1강 ReAct 루프를 여러분의 스택에서 여섯 형태 모두로 옮기세요. 어떤 제품 표면(product surface)에 어떤 형태가 맞나요?
- 큐 기반 데모에 DLQ를 추가하세요. 10% 작업 실패를 시뮬레이션하고 DLQ 크기를 표시합니다.
- 전날 상위 20개 추적을 대상으로 매일 밤 실행되는 cron 트리거 평가 에이전트(cron-triggered eval agent)를 작성하세요.
- 역압(backpressure)이 있는 스트리밍을 구현하세요. 클라이언트가 느리면 에이전트를 멈춥니다. 이것은 턴 예산(turn budget)과 어떻게 상호작용하나요?
- Claude Managed Agents 문서를 읽어보세요. 자체 호스팅 장기 작업 에이전트를 언제 관리형(managed)으로 옮기겠습니까?
핵심 용어
| 용어 | 흔한 설명 | 실제 의미 |
|---|
| 요청-응답(Request-response) | "동기식" | 사용자가 기다립니다. 짧은 작업에만 적합합니다. |
| 스트리밍(Streaming) | "SSE / WS" | 점진적 출력입니다. UX가 좋아지고 청크별 지연을 관찰할 수 있습니다. |
| 내구성 있는 실행(Durable execution) | "실패에서 재개" | 상태를 체크포인트로 저장하고 마지막 단계에서 다시 시작합니다. |
| 큐 기반(Queue-based) | "백그라운드 작업" | 생산자(producer) / 워커 풀(worker pool) / DLQ 구조입니다. |
| 이벤트 기반(Event-driven) | "트리거 기반" | 에이전트가 외부 이벤트에 반응합니다. |
| DLQ | "데드 레터 큐(Dead-letter queue)" | 실패한 작업을 임시로 세워두는 주차장입니다. |
| Claude Managed Agents | "호스팅 하니스(harness)" | Anthropic이 호스팅하는 장기 실행 비동기 런타임입니다. 캐싱(caching)과 압축(compaction)이 포함됩니다. |
더 읽을거리