고민보단 실천을

Durable Execution 입문: Temporal로 재시도와 상태 복구를 워크플로 수준에서 다루는 법 본문

카테고리 없음

Durable Execution 입문: Temporal로 재시도와 상태 복구를 워크플로 수준에서 다루는 법

Just-Do-It 2026. 4. 19. 20:59

Durable Execution 입문: Temporal로 재시도와 상태 복구를 워크플로 수준에서 다루는 법

재시도와 상태 복구를 애플리케이션 코드 곳곳에 흩뿌리면 결국 어디서 다시 시작해야 하는지 알기 어려워진다.

중급 설계에서는 Durable Execution이 필요한지, 그리고 상태/재시도/보상을 워크플로 엔진으로 올릴 가치가 있는지 판단해야 한다.

왜 지금 이 주제가 중요한가

  • 장시간 실행되는 비즈니스 플로우는 프로세스 재시작과 네트워크 오류를 자연스럽게 맞닥뜨린다.
  • 수동 재처리가 반복되면 상태 머신을 코드 외부로 끌어올릴 시점이다.
  • 워크플로 엔진은 강력하지만 새로운 운영 계층을 추가한다.

핵심 설계 포인트

  • 워크플로는 결정적(deterministic)이어야 하고, 외부 호출은 activity로 분리한다.
  • 재시도 정책은 activity와 workflow에서 다르게 잡는다.
  • 중복 실행 가능성을 고려해 activity는 멱등하게 만든다.
  • 운영자는 workflow 상태와 history를 쉽게 조회할 수 있어야 한다.

예시 구성

Workflow: createOrder -> reserveInventory -> chargePayment -> sendEmail
Activity retry: exponential backoff
Workflow state persists across worker restarts

적용 순서(실무 플로우)

큰 설계보다도, 작게 도입하고 관측하면서 범위를 넓히는 순서가 운영 성공률을 결정한다.

  1. 장시간 실행되거나 수동 재시도가 잦은 플로우를 찾는다.
  2. activity 경계와 입력/출력을 명확히 나눈다.
  3. 재시도, timeout, compensation 정책을 workflow 수준에서 정의한다.
  4. 기존 cron/job 처리와 병행 운영하며 복잡도를 비교한다.
  5. 운영 대시보드와 workflow 검색 규칙을 준비한다.

운영 체크포인트

  • 결정성 위반 코드를 코드 리뷰 체크리스트에 넣는다.
  • workflow id 설계와 검색 태그는 초기에 정한다.
  • 장애 시 workflow history만으로도 현재 상태를 설명할 수 있어야 한다.

운영 지표/알람 추천

  • 핵심 플로우 성공률과 보상 트랜잭션 비율
  • workflow 재시도 횟수와 중복 실행 비율
  • 장애 복구 시간과 수동 개입 횟수
  • 팀 간 변경 조율 비용(이슈/승인 시간)

빠른 점검 명령/쿼리

# 보상 트랜잭션이 실패할 때 수동 개입 경로 확인
# workflow 재시작 후 중복 실행이 없는지 검증
# 장애 난 상태를 끝까지 복구하는 runbook 점검

구조화 로그 필드 추천

  • requestId/traceId/eventId처럼 흐름을 잇는 키를 남긴다.
  • 버전, 테넌트, 리전, 대상 리소스 같은 핵심 차원을 구조화한다.
  • 실패 이유(reasonCode)와 재시도 횟수(retryAttempt)를 분리한다.
  • 민감정보는 마스킹하고, payload는 원본 대신 요약 정보만 남긴다.
{
"level": "INFO",
"message": "workflow step completed",
"traceId": "9ac1...",
"eventId": "evt_42",
"status": "DONE",
"retryAttempt": 1,
"latencyMs": 187
}

테스트 케이스 샘플

테스트 케이스(최소 3종):
1) 정상: 기대한 성공 경로와 상태 전이가 유지되는지
2) 실패: 오류가 예측 가능한 상태/코드로 떨어지는지
3) 동시성/재시도: 중복 요청·이벤트·배포 상황에서도 깨지지 않는지

추가(가능하면):
- 장애 복구: 프로세스 재시작, 네트워크 지연, 설정 rollback 이후에도 회복되는지
- 운영 검증: 대시보드와 알람만으로 원인을 좁힐 수 있는지

트레이드오프/대안

  • 운영 복잡도를 줄이면 유연성이 줄고, 유연성을 높이면 운영 비용이 올라간다.
  • 기본값은 정답이 아니라 출발점이다. 실제 트래픽과 장애 패턴을 보고 조정해야 한다.
  • 문서와 자동화가 없으면 좋은 설계도 팀이 늘어나는 순간 무너진다.
  • 관측 없이 최적화하면 체감 개선과 회귀를 구분하기 어렵다.

성공 기준(SLO) 예시

  • 핵심 경로 에러율: 0.1% 이하
  • 핵심 요청/이벤트 p95 지연: 서비스 목표 내 유지
  • 중복 실행/유실/권한 우회 같은 치명적 부작용: 0건
  • 장애 감지 후 임시 조치까지 걸리는 시간: 10분 이내

자주 터지는 실수/트러블슈팅

  1. 일반 API 요청 수준의 짧은 작업까지 workflow로 올린다.
  2. activity 멱등성을 고려하지 않는다.
  3. workflow 검색/운영 도구 없이 도입한다.

바로 적용 템플릿

Durable Execution 템플릿:
workflow 경계 / activity 경계
retry / timeout / compensation
workflow id / search attributes
운영 조회 경로

검증 방법

  • worker를 중간에 재시작해도 workflow가 이어서 진행되는지 확인한다.
  • 같은 activity가 재시도돼도 외부 부작용이 한 번만 발생하는지 검증한다.

장애 대응 Runbook(초안)

  • 현상: 어디서 무엇이 깨졌는지 한 문장으로 적는다.
  • 범위: 언제부터, 누구에게, 어느 경로에서 발생했는지 정리한다.
  • 증거: 로그 3줄, 지표 1개, 최근 배포/설정 변경 1개를 먼저 모은다.
  • 임시 조치: 차단, rollback, 스위치 전환, 재시도 제한 중 무엇을 할지 정한다.
  • 근본 원인: 계약, 설정, 타임아웃, 리소스, 운영 절차 중 어느 축이 깨졌는지 좁힌다.
  • 재발 방지: 테스트, 알람, 기본값, 문서를 함께 바꾼다.

리뷰 체크리스트

  1. 상태 전이와 실패 시나리오가 문서와 코드에서 같은 의미로 정의돼 있다.
  2. 타임아웃, 재시도, 권한, 캐시 같은 보호 장치가 서로 충돌하지 않는다.
  3. 운영 중 재현 가능한 로그/지표/상관관계 키가 있다.
  4. 롤백 또는 비상 스위치가 준비돼 있다.
  5. 최소 1개 이상의 실패/동시성/복구 테스트가 자동화돼 있다.
  6. 공식 문서 링크와 팀 의사결정 근거가 남아 있다.

도입 전 질문 체크리스트

  • 이 주제의 기본값을 누가 바꿀 수 있고, 변경 기록은 어디에 남는가?
  • 배포 직후 문제가 생기면 10분 안에 되돌릴 수 있는가?
  • 새로운 팀원이 문서만 보고도 같은 규칙을 재현할 수 있는가?
  • 장애가 났을 때 고객 영향 범위를 바로 설명할 수 있는가?

팀 문서 템플릿

팀 문서 템플릿(복붙용):
1) 목표/배경: 어떤 장애/비용을 줄이려는가
2) 범위: 어느 API/토픽/클러스터/브라우저/테넌트에 적용하는가
3) 규칙: 버전, TTL, timeout, retry, 소유 팀, 기본값
4) 예외: 차단 조건과 에러 코드, 수동 개입 조건
5) 운영: 대시보드, 알람, 배포/실험 주기
6) 장애 대응: 임시 조치, rollback, 후속 공지 절차
7) 변경 이력: 언제 누가 왜 값을 바꿨는가

FAQ(자주 묻는 질문)

Q. 처음부터 완벽하게 도입해야 하나요?
A. 아니다. 핵심 경로 1개부터 시작해서 지표와 장애 패턴을 보며 넓히는 편이 안전하다.

Q. "Durable Execution 입문: Temporal로 재시도와 상태 복구를 워크플로 수준에서 다루는 법"를 넣었는데도 문제가 남습니다. 어디부터 봐야 하나요?
A. 최근 변경점과 상관관계 키가 있는 로그를 먼저 보고, 기본값과 경계 조건이 실제 트래픽에 맞는지 확인한다.

Q. 팀마다 구현이 달라집니다. 무엇을 가장 먼저 고정해야 하나요?
A. 상태 전이, 예외 처리, 기본값, rollback 기준 네 가지를 먼저 문서화해야 한다.

참고/출처

Comments