Skip to main content
Workflow μ‹€ν–‰ 쀑 λ°œμƒν•˜λŠ” μ—λŸ¬λ₯Ό μ²˜λ¦¬ν•˜λŠ” 방법을 λ‹€λ£Ήλ‹ˆλ‹€. μ™ΈλΆ€ API 호좜, λ„€νŠΈμ›Œν¬ 문제, μΌμ‹œμ  μž₯μ•  λ“±μœΌλ‘œ μΈν•œ μ‹€νŒ¨λ₯Ό μ•ˆμ „ν•˜κ²Œ μ²˜λ¦¬ν•˜κ³ , ν•„μš”ν•œ 경우 μžλ™μœΌλ‘œ μž¬μ‹œλ„ν•˜λŠ” νŒ¨ν„΄μ„ κ΅¬ν˜„ν•  수 μžˆμŠ΅λ‹ˆλ‹€.

κΈ°λ³Έ μ—λŸ¬ 처리

Workflowμ—μ„œ λ°œμƒν•œ μ—λŸ¬λŠ” 일반적인 try-catch 문으둜 μ²˜λ¦¬ν•©λ‹ˆλ‹€. μ—λŸ¬λ₯Ό λ‘œκΉ…ν•˜κ³ , ν•„μš”ν•œ 경우 μž¬λ°œμƒμ‹œμΌœ workflowλ₯Ό μ‹€νŒ¨ μƒνƒœλ‘œ λ§Œλ“­λ‹ˆλ‹€.
핡심 κ°œλ…:
  • logger.error()둜 μ—λŸ¬ 기둝
  • throw error둜 workflow μ‹€νŒ¨ 처리
  • μ‹€νŒ¨ν•œ workflowλŠ” Workerκ°€ μžλ™μœΌλ‘œ μž¬μ‹œλ„

Step별 μ—λŸ¬ 처리

λͺ¨λ“  step이 ν•„μˆ˜λŠ” μ•„λ‹™λ‹ˆλ‹€. 일뢀 step은 μ‹€νŒ¨ν•΄λ„ workflowλ₯Ό 계속 μ§„ν–‰ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 이런 선택적 step은 try-catch둜 κ°μ‹Έμ„œ μ—λŸ¬λ₯Ό ν‘μˆ˜ν•©λ‹ˆλ‹€.
μ‚¬μš© μ‹œλ‚˜λ¦¬μ˜€:
  • 캐싱 μ‹€νŒ¨ (λ°μ΄ν„°λŠ” μ €μž₯λ˜μ–΄μ•Ό 함)
  • μ•Œλ¦Ό λ°œμ†‘ μ‹€νŒ¨ (주문은 μ™„λ£Œλ˜μ–΄μ•Ό 함)
  • 둜그 기둝 μ‹€νŒ¨ (λΉ„μ¦ˆλ‹ˆμŠ€ λ‘œμ§μ€ 계속)

μž¬μ‹œλ„ νŒ¨ν„΄

μˆ˜λ™ μž¬μ‹œλ„

μ™ΈλΆ€ APIλ‚˜ λ„€νŠΈμ›Œν¬ μš”μ²­μ€ μΌμ‹œμ μœΌλ‘œ μ‹€νŒ¨ν•  수 μžˆμŠ΅λ‹ˆλ‹€. 이런 경우 μ—¬λŸ¬ 번 μž¬μ‹œλ„ν•˜μ—¬ 성곡λ₯ μ„ 높일 수 μžˆμŠ΅λ‹ˆλ‹€.
μž¬μ‹œλ„ μ „λž΅:
  1. μ΅œλŒ€ 3번 μ‹œλ„
  2. μ‹œλ„ 사이에 5초 λŒ€κΈ°
  3. λͺ¨λ“  μ‹œλ„ μ‹€νŒ¨ μ‹œ μ—λŸ¬ λ°œμƒ

μ§€μˆ˜ λ°±μ˜€ν”„

μž¬μ‹œλ„ 간격을 점점 λŠ˜λ¦¬λŠ” μ§€μˆ˜ λ°±μ˜€ν”„(Exponential Backoff) μ „λž΅μ€ μ„œλ²„ κ³ΌλΆ€ν•˜λ₯Ό λ°©μ§€ν•˜λ©΄μ„œ μž¬μ‹œλ„ 성곡λ₯ μ„ λ†’μž…λ‹ˆλ‹€.
λ°±μ˜€ν”„ 간격:
  • 1μ°¨ μ‹€νŒ¨ β†’ 2초 λŒ€κΈ°
  • 2μ°¨ μ‹€νŒ¨ β†’ 4초 λŒ€κΈ°
  • 3μ°¨ μ‹€νŒ¨ β†’ 8초 λŒ€κΈ°
  • 4μ°¨ μ‹€νŒ¨ β†’ 16초 λŒ€κΈ°
μž₯점:
  • μΌμ‹œμ  κ³ΌλΆ€ν•˜μ—μ„œ νšŒλ³΅ν•  μ‹œκ°„ 제곡
  • μ„œλ²„ λΆ€ν•˜ λΆ„μ‚°
  • μž¬μ‹œλ„ 성곡λ₯  ν–₯상

보상 νŠΈλžœμž­μ…˜

λΆ„μ‚° νŠΈλžœμž­μ…˜μ—μ„œλŠ” 일뢀 μž‘μ—…μ΄ μ‹€νŒ¨ν•˜λ©΄ 이미 μ™„λ£Œλœ μž‘μ—…μ„ λ˜λŒλ €μ•Ό ν•©λ‹ˆλ‹€. 이λ₯Ό 보상 νŠΈλžœμž­μ…˜(Compensating Transaction)이라고 ν•©λ‹ˆλ‹€.
보상 νŠΈλžœμž­μ…˜ νŒ¨ν„΄:
  1. 각 μž‘μ—…μ˜ μ™„λ£Œ μƒνƒœ 좔적
  2. μ‹€νŒ¨ λ°œμƒ μ‹œ μ™„λ£Œλœ μž‘μ—… 확인
  3. μ—­μˆœμœΌλ‘œ μž‘μ—… μ·¨μ†Œ
  4. μ—λŸ¬ μž¬λ°œμƒ
μ‹€μ „ μ‚¬μš©:
  • 결제 μ·¨μ†Œ
  • 재고 볡원
  • μ˜ˆμ•½ μ·¨μ†Œ
  • 파일 μ‚­μ œ

νƒ€μž„μ•„μ›ƒ 처리

μ™ΈλΆ€ APIκ°€ μ‘λ‹΅ν•˜μ§€ μ•ŠμœΌλ©΄ workflowκ°€ λ¬΄ν•œμ • λŒ€κΈ°ν•  수 μžˆμŠ΅λ‹ˆλ‹€. νƒ€μž„μ•„μ›ƒμ„ μ„€μ •ν•˜μ—¬ 일정 μ‹œκ°„ ν›„ μ‹€νŒ¨ μ²˜λ¦¬ν•©λ‹ˆλ‹€.
νƒ€μž„μ•„μ›ƒ μ „λž΅:
  • 짧은 νƒ€μž„μ•„μ›ƒ (5-10초): λΉ λ₯Έ API
  • 쀑간 νƒ€μž„μ•„μ›ƒ (30-60초): 일반 API
  • κΈ΄ νƒ€μž„μ•„μ›ƒ (5-10λΆ„): 파일 처리

μ—λŸ¬ νƒ€μž…λ³„ 처리

μ—λŸ¬μ˜ μ’…λ₯˜μ— 따라 λ‹€λ₯Έ 처리 μ „λž΅μ„ μ‚¬μš©ν•©λ‹ˆλ‹€. λ„€νŠΈμ›Œν¬ μ—λŸ¬λŠ” μž¬μ‹œλ„ν•˜μ§€λ§Œ, 데이터 검증 μ—λŸ¬λŠ” μ¦‰μ‹œ μ‹€νŒ¨ μ²˜λ¦¬ν•©λ‹ˆλ‹€.
μ—λŸ¬ λΆ„λ₯˜:

μ‹€μ „ 예제

1. 이메일 λ°œμ†‘ with Dead Letter Queue

이메일 λ°œμ†‘μ΄ 3번 μ‹€νŒ¨ν•˜λ©΄ Dead Letter Queue에 μΆ”κ°€ν•˜μ—¬ λ‚˜μ€‘μ— μˆ˜λ™μœΌλ‘œ μ²˜λ¦¬ν•©λ‹ˆλ‹€.
DLQ νŒ¨ν„΄:
  • 3번 μž¬μ‹œλ„ μ‹€νŒ¨
  • DLQ에 μΆ”κ°€ (λ‚˜μ€‘μ— 처리)
  • κ΄€λ¦¬μžμ—κ²Œ μ•Œλ¦Ό

2. API 호좜 with Circuit Breaker

μ™ΈλΆ€ APIκ°€ 계속 μ‹€νŒ¨ν•˜λ©΄ **회둜 차단기(Circuit Breaker)**둜 μš”μ²­μ„ μ°¨λ‹¨ν•˜μ—¬ μ‹œμŠ€ν…œμ„ λ³΄ν˜Έν•©λ‹ˆλ‹€.
Circuit Breaker μƒνƒœ:
  • Closed: 정상 μž‘λ™
  • Open: 5번 μ‹€νŒ¨ ν›„ 차단 (1λΆ„κ°„)
  • Half-Open: 1λΆ„ ν›„ μž¬μ‹œλ„

3. 파일 μ—…λ‘œλ“œ with λΆ€λΆ„ μž¬μ‹œλ„

μ—¬λŸ¬ νŒŒμΌμ„ μ—…λ‘œλ“œν•  λ•Œ, 각 νŒŒμΌμ„ λ…λ¦½μ μœΌλ‘œ μž¬μ‹œλ„ν•˜μ—¬ 일뢀 μ‹€νŒ¨ν•΄λ„ λ‚˜λ¨Έμ§€λŠ” μ„±κ³΅ν•˜λ„λ‘ ν•©λ‹ˆλ‹€.
λΆ€λΆ„ μž¬μ‹œλ„ μ „λž΅:
  • 각 파일이 독립적인 stepλ“€
  • νŒŒμΌλ³„ 3번 μž¬μ‹œλ„
  • 일뢀 μ‹€νŒ¨ν•΄λ„ workflow 성곡
  • μ‹€νŒ¨ν•œ 파일 λͺ©λ‘ λ°˜ν™˜

μ£Όμ˜μ‚¬ν•­

μ—λŸ¬ 처리 μ‹œ μ£Όμ˜μ‚¬ν•­:
  1. μ—λŸ¬ λ‘œκΉ…: 항상 μ—λŸ¬λ₯Ό λ‘œκΉ…ν•˜μ—¬ 문제λ₯Ό 좔적할 수 μžˆμ–΄μ•Ό ν•©λ‹ˆλ‹€.
  2. μž¬μ‹œλ„ μ œν•œ: λ¬΄ν•œ μž¬μ‹œλ„λ₯Ό λ°©μ§€ν•˜κ³  μ΅œλŒ€ 횟수λ₯Ό μ„€μ •ν•˜μ„Έμš”.
  3. 보상 νŠΈλžœμž­μ…˜: μ‹€νŒ¨ μ‹œ 이미 μ™„λ£Œλœ μž‘μ—…μ„ μ •λ¦¬ν•˜μ„Έμš”.
  4. νƒ€μž„μ•„μ›ƒ μ„€μ •: λ¬΄ν•œ λŒ€κΈ°λ₯Ό λ°©μ§€ν•˜μ„Έμš”.
  5. Dead Letter Queue: μ΅œμ’… μ‹€νŒ¨ μ‹œ μˆ˜λ™ 처리λ₯Ό μœ„ν•΄ λ³„λ„λ‘œ μ €μž₯ν•˜μ„Έμš”.
  6. μ—λŸ¬ νƒ€μž… ꡬ뢄: μž¬μ‹œλ„ κ°€λŠ₯ν•œ μ—λŸ¬μ™€ λΆˆκ°€λŠ₯ν•œ μ—λŸ¬λ₯Ό κ΅¬λΆ„ν•˜μ„Έμš”.

λ‹€μŒ 단계

@workflow λ°μ½”λ ˆμ΄ν„°

Workflow μ •μ˜μ™€ μŠ€μΌ€μ€„λ§ 배우기

Step

Step으둜 μž‘μ—…μ„ λ‚˜λˆ„κ³  κ΄€λ¦¬ν•˜κΈ°

Worker μ„€μ •

Worker ν”„λ‘œμ„ΈμŠ€ μ„€μ •ν•˜κΈ°