Temporal의 핵심 개념 Workflow와 Activity :: 잡다한 프로그래밍
반응형

Temporal에서 클라이언트 개발자는 워크플로우(Workflow)액티비티(Activity) 두 가지만 신경 쓰면 된다.

  • 워크플로우 (Workflow): 작업의 순서를 정의하는 “관리자”
  • 액티비티 (Activity): 실제 비즈니스 로직을 실행하는 “노동자”

 

워크플로우는 일반 함수가 아니다 — “죽지 않는 프로그램”

보통의 함수는 메모리에서 실행되고 프로그램이 종료되면 사라진다.
하지만 Temporal의 워크플로우는 절대 죽지 않는다.

  • 네트워크가 끊겨도
  • 서버가 재시작되어도
  • 시간이 며칠, 몇 달이 지나도

Temporal 서버가 중단된 시점부터 다시 이어서 실행시킨다.

 

어떻게 이런 게 가능할까? — 결정론적 실행(Deterministic Execution)

Temporal의 핵심은 바로 결정론적 실행 보장이다.

동일한 입력(Input)에 대해 항상 동일한 결과(Output)을 보장한다.
즉, “멱등성(Idempotency)”이 내장되어 있다.

예를 들어 주문 처리 워크플로우를 생각해보자:

public void processOrderWorkflow() {
  reserveInventory();
  processPayment();
  sendReceipt();
}
  • 이 워크플로우가 네트워크 오류로 중단되더라도
  • Temporal은 마지막 성공 지점(세이브 포인트)을 기준으로
    자동으로 재실행하면서 동일한 결과를 복원한다.

즉, “다시 실행하더라도 결과는 언제나 같다.”
이게 Temporal 워크플로우의 결정론적 실행 모델이다.

 

시간 제약이 없다 — 장기 실행 가능한 워크플로우

워크플로우는 몇 초, 몇 분짜리 함수가 아니다.
며칠, 몇 주, 심지어 몇 달 동안도 실행 가능하다.

Temporal은 내부적으로 각 단계별 상태를 DB에 저장해두기 때문에,
스프링 배치(Spring Batch)처럼 세이브 포인트(Save Point) 에서 재개할 수 있다.

예를 들어 “3일 후 결제 확인” 같은 장기 지연 로직도
워크플로우 안에서 자연스럽게 작성할 수 있다.

Workflow.sleep(Duration.ofDays(3));
checkPaymentStatus();

 

버전 호환성 — 실행 중인 워크플로우는 그대로 유지된다

Temporal은 새로운 워크플로우 버전을 배포하더라도
이미 실행 중인 워크플로우는 중단되지 않고 기존 버전대로 동작한다.

이 덕분에:

  • 프로세스 개선이나 코드 리팩토링이 쉬움
  • 배포 중에도 안정성 유지
  • 긴 워크플로우 실행에도 버전 충돌 없음

즉, “시간에 독립적인 시스템” 이다.

 

단점 — 예측 가능성과 외부 의존성의 제약

Temporal 워크플로우는 결정론적이어야 하기 때문에
다음과 같은 비결정적 코드 사용이 금지된다:

비결정적 동작이유
System.currentTimeMillis() 실행 시점마다 다름
UUID.randomUUID() 호출할 때마다 달라짐
외부 API 호출 네트워크 상태, 응답 값이 매번 달라짐
비즈니스 로직 계산 외부 상태에 의존 가능성 있음

이런 코드는 결과가 실행마다 달라질 수 있기 때문에
워크플로우 내부에선 사용 불가하다.

 

그래서 등장한 개념 — 액티비티(Activity)

이 문제를 해결하기 위해 Temporal은
워크플로우와 별도로 액티비티(Activity) 라는 개념을 제공한다.

역할설명
워크플로우 작업의 순서와 상태를 관리하는 컨트롤러
액티비티 실제 외부 연산(DB, API, 파일 등)을 수행하는 작업자

즉,

워크플로우는 “무엇을 할지” 정의하고
액티비티는 “어떻게 할지” 수행한다.

워크플로우는 직접 DB나 외부 API를 호출하지 않고,
Temporal 서버를 통해 액티비티를 호출한다.

이때 Temporal이 자동으로 다음을 처리한다:

  • 액티비티 실패 시 재시도
  • 타임아웃, 백오프, 장애 복구
  • 로그 및 히스토리 저장

결과적으로 워크플로우는 순수 함수처럼, 액티비티는 비즈니스 로직처럼 동작한다.

 

워크플로우와 액티비티 호출 흐름

[Workflow 코드]
    ↓
[Temporal Server] ← 상태 저장, 재시도, 장애 복구 관리
    ↓
[Activity Worker] ← 실제 DB/API 호출 수행
 
 

워크플로우는 액티비티를 직접 실행하지 않는다.
Temporal 서버가 중간에서 조율하며, 재시도 / 대기 / 복구 로직을 대신 관리한다.

반응형

+ Recent posts