본문으로 건너뛰기

분석은 in-process 큐 + LangGraph fan-out으로 돌린다

결정일상태원본
2026-07-22activeheymoa-ai/docs/decisions/2026-07-22-analysis-execution-engine.md

근거 전문은 전사 분석 기능 설계에 있다. 여기에는 언제 뒤집어야 하는가만 적는다.

결정 넷

  1. 비동기 실행은 AnalysisQueue port 뒤의 asyncio.Queue. 워커는 안 띄운다 APP-298에서 뒤집혔다. 큐도 소비자도 없고 BackgroundTasks가 응답 뒤에 돌린다. 겹치는 잡은 PgSingleFlight의 advisory lock이 막는다 — 동시 실행 상한 ADR
  2. 분석 엔진은 LangGraph fan-out 3노드. checkpointer 없음
  3. LLM은 OpenAI. vLLM은 어댑터 없이 base_url만 다름
  4. 캐시 경계는 CachedPrompt(prefix, instruction)로 데이터에 표현한다

나머지 셋은 그대로다. 결정 1만 뒤집혀서 문서 전체를 superseded로 두지 않는다.

되돌리는 조건

결정뒤집을 때
in-process 큐뒤집혔다. 별도 워커로 가는 트리거는 그대로다 — 분석 유실이 관측되거나 분석 시간이 배포 주기보다 길어질 때
LangGraph fan-out병렬을 접고 단일 호출 + structured output으로 가면 그래프가 무의미해진다. 그때는 TranscriptAnalyzer 구현만 갈아낀다
OpenAIBedrock으로 갈 때 — LangChain이 cachePoint를 벗겨내면(deepagents#917) boto3 Converse 직접 호출로 내려간다. Bedrock 캐싱은 Claude·Nova만 지원
소비자 2개소비자가 없어졌다. 동시 실행을 다시 조일 조건은 위 ADR에 있다

LangGraph 결정은 한 번 뒤집혔다

처음에는 "분석에 LangGraph를 쓰지 않는다"였다. 순차 3회 호출이면 노드 3개짜리 직선 그래프가 await 세 줄보다 나을 게 없기 때문이다.

병렬 fan-out이 확정되면서 판단이 바뀌었다. fan-out/fan-in과 노드별 재시도가 LangGraph의 기본 기능이라 직접 짤 이유가 없어졌다.

이 경위를 남기는 이유 — 그래프를 나중에 본 사람이 "직선 3개인데 왜 그래프냐"고 걷어낼 수 있다. 직선이 아니라 병렬이라서 그래프다.