기본 에러 처리
Workflow에서 발생한 에러는 일반적인 try-catch 문으로 처리합니다. 에러를 로깅하고, 필요한 경우 재발생시켜 workflow를 실패 상태로 만듭니다.logger.error()로 에러 기록throw error로 workflow 실패 처리- 실패한 workflow는 Worker가 자동으로 재시도
Step별 에러 처리
모든 step이 필수는 아닙니다. 일부 step은 실패해도 workflow를 계속 진행할 수 있습니다. 이런 선택적 step은 try-catch로 감싸서 에러를 흡수합니다.- 캐싱 실패 (데이터는 저장되어야 함)
- 알림 발송 실패 (주문은 완료되어야 함)
- 로그 기록 실패 (비즈니스 로직은 계속)
재시도 패턴
수동 재시도
외부 API나 네트워크 요청은 일시적으로 실패할 수 있습니다. 이런 경우 여러 번 재시도하여 성공률을 높일 수 있습니다.- 최대 3번 시도
- 시도 사이에 5초 대기
- 모든 시도 실패 시 에러 발생
지수 백오프
재시도 간격을 점점 늘리는 지수 백오프(Exponential Backoff) 전략은 서버 과부하를 방지하면서 재시도 성공률을 높입니다.- 1차 실패 → 2초 대기
- 2차 실패 → 4초 대기
- 3차 실패 → 8초 대기
- 4차 실패 → 16초 대기
- 일시적 과부하에서 회복할 시간 제공
- 서버 부하 분산
- 재시도 성공률 향상
보상 트랜잭션
분산 트랜잭션에서는 일부 작업이 실패하면 이미 완료된 작업을 되돌려야 합니다. 이를 보상 트랜잭션(Compensating Transaction)이라고 합니다.- 각 작업의 완료 상태 추적
- 실패 발생 시 완료된 작업 확인
- 역순으로 작업 취소
- 에러 재발생
- 결제 취소
- 재고 복원
- 예약 취소
- 파일 삭제
타임아웃 처리
외부 API가 응답하지 않으면 workflow가 무한정 대기할 수 있습니다. 타임아웃을 설정하여 일정 시간 후 실패 처리합니다.- 짧은 타임아웃 (5-10초): 빠른 API
- 중간 타임아웃 (30-60초): 일반 API
- 긴 타임아웃 (5-10분): 파일 처리
에러 타입별 처리
에러의 종류에 따라 다른 처리 전략을 사용합니다. 네트워크 에러는 재시도하지만, 데이터 검증 에러는 즉시 실패 처리합니다.| 에러 타입 | 처리 방법 | 예시 |
|---|---|---|
| 일시적 에러 | 재시도 | 네트워크, 타임아웃, 503 |
| 영구적 에러 | 즉시 실패 | 검증, 인증, 404 |
| 부분 실패 | 선택적 처리 | 일부 데이터 손상 |
실전 예제
1. 이메일 발송 with Dead Letter Queue
이메일 발송이 3번 실패하면 Dead Letter Queue에 추가하여 나중에 수동으로 처리합니다.- 3번 재시도 실패
- DLQ에 추가 (나중에 처리)
- 관리자에게 알림
2. API 호출 with Circuit Breaker
외부 API가 계속 실패하면 **회로 차단기(Circuit Breaker)**로 요청을 차단하여 시스템을 보호합니다.- Closed: 정상 작동
- Open: 5번 실패 후 차단 (1분간)
- Half-Open: 1분 후 재시도
3. 파일 업로드 with 부분 재시도
여러 파일을 업로드할 때, 각 파일을 독립적으로 재시도하여 일부 실패해도 나머지는 성공하도록 합니다.- 각 파일이 독립적인 step들
- 파일별 3번 재시도
- 일부 실패해도 workflow 성공
- 실패한 파일 목록 반환
