목차7개 항목
출처와 참고
인프랩 기술 블로그의 「Jenkins에서 Temporal로」(2026.10)를 바탕으로 재구성한 노트다.
내구성 워크플로란
내구성 워크플로(durable workflow)는 실행 상태와 이력을 외부 저장소에 남겨, 서버나 워커가 죽었다 살아나도 중단된 지점부터 이어서 실행하는 작업 흐름이다. 여러 단계로 이뤄진 배치·파이프라인을 하나의 코드로 기술하되, 그 코드가 어디까지 진행됐는지를 엔진이 기억한다. Temporal은 이 모델을 제공하는 오픈소스 엔진이다.
스케줄 배치(정해진 시각마다 도는 작업)를 Jenkins 류로 운영하다 생기는 문제를 풀기 위한 대안으로 쓰인다.
왜 필요한가: 스케줄 배치를 Jenkins로 돌릴 때의 문제
| 문제 | 내용 |
|---|---|
| 디스크 포화 | 빌드 이력이 쌓여 디스크가 차면 배치가 전면 중단된다 |
| 플러그인 충돌 | 플러그인 의존성이 충돌해 기동 자체가 실패한다 |
| 실패 알림 누락 | 중간 단계가 실패해도 마지막 단계가 성공하면 전체가 SUCCESS로 찍힌다. 서버가 죽으면 알림조차 가지 않는다 |
| 낮은 자원 효율 | 상시 켜 둔 서버의 평균 CPU는 낮지만, 작업이 한때 몰리면 자원 경합이 난다 |
네 문제의 공통 원인은 실행 상태가 서버 한 대에 묶여 있다는 점이다. 그 서버가 흔들리면 작업과 관측이 함께 무너진다.
Temporal의 구조
| 구성 요소 | 역할 |
|---|---|
| Workflow | 실행 순서(무엇을 어떤 순서로)를 일반 프로그래밍 언어 코드로 기술한다 |
| Activity | 실제 작업 한 단위. Workflow가 호출한다 |
| 서버 | 언제 무엇을 실행할지 관리하고, 실행 상태·이력을 DB에 저장한다 |
| 워커(worker) | 서버의 지시를 받아 Workflow·Activity를 실제로 실행한다 |
- 서버와 워커가 분리돼 있다. 실행을 지시하는 쪽과 실행하는 쪽이 다른 프로세스다.
- 실행 상태와 이력을 DB에 저장하므로, 서버나 워커가 재시작돼도 중단 지점부터 이어 실행한다. 이것이 내구성의 핵심이다.
- Heartbeat와 타임아웃으로 오래 걸리는 Activity의 생존을 확인하고, 멈춘 작업을 감지한다.
- Schedule 기능으로 정해진 시각마다 Workflow를 띄운다.
왜 Argo가 아니라 Temporal인가
| 기준 | Argo Workflows | Temporal |
|---|---|---|
| 작성 방식 | YAML + GitOps, 별도 DSL 학습 필요 | 일반 프로그래밍 언어 코드 |
| 타입 검사·테스트·리뷰 | 제한적 | 코드라서 기존 도구를 그대로 활용 |
| 이력 보관 | 별도 구성 | DB에 저장 |
| 기존 배치 이미지 | 재구성 필요할 수 있음 | 그대로 재사용 |
- 워크플로를 일반 코드로 쓰므로 타입 검사·단위 테스트·코드 리뷰를 그대로 적용한다.
- 상태 저장소로 기존 Aurora PostgreSQL에 DB를 추가하면 별도 저장 인프라 없이 비용을 아낄 수 있다.
cron·Jenkins와 Temporal의 역할 차이
- cron·Jenkins의 스케줄은 "정해진 시각에 트리거를 당긴다"까지 한다. 그 작업이 중간에 죽으면 상태는 사라진다.
- Temporal은 트리거 이후의 실행을 내구성 있게 책임진다. 어디까지 진행됐는지 DB에 남겨, 재시작에도 이어서 실행하고 실패를 정확히 포착한다.
즉 "언제 시작할지"와 "실행을 어떻게 끝까지 지켜볼지"는 다른 문제이고, Temporal이 채우는 자리는 후자다.
운영 주의점
| 주제 | 주의점 |
|---|---|
| 배치 실행·알림 | SDK는 실행 기능만 준다. 배치 실행과 실패 알림은 직접 구현해 공용 라이브러리로 묶는다 |
| 중복 실행 방지 | K8s Job 이름에 Run ID와 시도 번호를 넣고, K8s 재시도는 0으로 둔다. 재시도는 Temporal에서만 관리한다 |
| 스케줄 상태 | enabled 여부를 코드로 관리하면 워커 재기동 시 UI 상태가 되돌아간다. 새 스케줄은 일시정지로 등록하고 실행 여부는 UI에서 켠다 |
| 노드 축소 | Karpenter가 노드를 줄이며 배치 파드를 내보내 실패시킬 수 있다. karpenter.sh/do-not-disrupt 애너테이션으로 막는다 |
| 따라잡기(catch-up) | 기본값이 1년이라 놓친 실행을 과도하게 몰아 돌린다. 1시간 이내로 제한한다 |
| 로그 | UI가 출력 로그를 보여 주지 않으므로 Datadog 같은 외부 수집을 연동한다 |
| 복잡도 | 서버·워커·DB 구성 탓에 Jenkins보다 도입·운영 복잡도가 높다 |
정리
- 내구성 워크플로는 실행 상태를 DB에 남겨 재시작에도 이어 실행하는 작업 흐름이고, Temporal이 그 엔진이다.
- Jenkins 스케줄 배치의 디스크 포화·플러그인 충돌·알림 누락은 상태가 서버 한 대에 묶인 데서 온다.
- Temporal은 Workflow(코드로 쓴 실행 순서)와 Activity(작업 단위)를 서버와 워커가 나눠 실행하고, 상태를 DB에 저장한다.
- cron·Jenkins는 트리거를, Temporal은 그 뒤의 내구성 있는 실행을 맡는다.
- 코드로 쓴다는 장점만큼 중복 실행·노드 축소·catch-up·로그 수집 같은 운영 설정을 직접 챙겨야 한다.
관련 노트: CI/CD, 배포 전략, 쿠버네티스 구조와 핵심 개념