problem
배치의 결과에 따라(특정조건) 배치를 반복 종료 할 때가 있다.
특정 조건에 따라 재시도(Retry) / 건너뛰기(Skip) 할 수 있다.
solution
Repeat
- 복잡한 청크 완료 조건: 기본적인 청크 크기 외에 다른 조건에 따라 반복을 제어할 수 있다.
- 커스텀 반복 로직이 필요한 경우: 특정 작업을 여러 번 반복해야 할 때, 반복 횟수나 종료 조건을 직접 정의할 수 있다.
- 에러 처리 및 재시도 로직: 작업 중 오류가 발생했을 때(특정 조건에 충족하지 못했을 때), 일정 횟수만큼 재시도하거나 특정 조건이 충족될 때까지 반복하도록 설정할 수 있다.
스프링 배치는 RepeatTemplate 기본으로 제공하여 기능을 구현 시킬 수 있다.
RepeatTemplate
인터셉터처럼 step 전 후에 적용하여 반복 및 예외를 제어할 수 있다.
RepeatStatus (Enum)
RepeatTemplate 내에서 작업이 완료되었는지(FINISHED) 또는 계속 반복해야 하는지(CONTINUABLE)를 결정한다
CompletionPolicy
반복 작업의 종료 조건을 정의하여, RepeatTemplate이 반복을 언제 멈출지 결정한다
- 실행 횟수 / 완료시기 / 오류 발생시 수행 할 작업에 대한 반복여부 결정
- 정상 종료를 알리는데 사용된다
ExceptionHandler
RepeatTemplate 내에서 발생하는 예외를 처리하며, 예외 발생 시 반복을 계속할지 중단할지 결정한다.
- 연결 문제가 발생하면 재시도하도록 설정하거나, 특정 조건을 만족하지 못할 때 예외를 발생시키고 반복을 종료할 수 있다
- 비정상 종료를 알리는데 사용된다
예외를 던질것인지 로그만 남기고 계속적으로 반복문을 수행할 것인지 결정하게 된다.
내결함성
오류가 발생해도 Step 이 즉시 종료되지 않고 Retry 혹은 Skip 기능을 활성화 함으로써 내결함성(정상작동)을 가능하도록 한다
FaultTolerant
Skip
- ItemReader / ItemProcessor / ItemWriter 에 적용 할 수 있다
Retry
- ItemProcessor / ItemWriter 에 적용할 수 있다
- FaultTolerant 구조는 청크 기반의 프로세스 기반위에 Skip 과 Retry 기능이 추가되어 재정의 되어 있다
1. Transaction: 전체 과정이 트랜잭션 내에서 실행됩니다.
2. ChunkOrientedTasklet: ChunkProvider와 ChunkProcessor를 통해 청크 단위로 작업을 처리합니다.
3. Skip과 Retry:
• ItemReader와 ItemProcessor, ItemWriter에서 예외가 발생하면 정의된 횟수만큼 재시도(RetryCount), 또는 지정된 횟수만큼 예외를 건너뜁니다(SkipCount).
4. Repeat: 각 단계는 반복 실행되며, 청크 크기만큼 아이템을 처리한 후 트랜잭션이 커밋됩니다.
retry
1. Step: 스텝은 RepeatTemplate을 통해 반복 작업을 수행합니다.
2. ItemProcessor: 데이터를 처리하다가 특정 아이템(Item2)에서 오류가 발생합니다.
3. Retry: 오류가 발생한 아이템에 대해 재시도를 시도합니다.
4. ItemWriter: 재시도 후 오류가 해결되면 아이템을 ItemWriter로 전달해 최종 처리를 합니다.
지정한 예외에 포함 되어있으면 재시도 카운터를 체크해서 재시도를 하게 된다.
재시도 횟수가 초과되면 recover callback 을 수행한다.
Recover callback
재시도 로직이 실패한 후, 마지막으로 대체 행동을 취한다.
즉, 특정 작업을 여러 번 재시도했으나 실패했을 때, RecoverCallback을 사용해 실패 상황에 대한 복구 작업을 수행하거나 대체 로직을 실행한다.
ex. 데이터베이스 연결을 여러 번 시도했으나 모두 실패했을 때, 로그를 남기거나 다른 경로로 데이터를 저장하는 등의 대체 작업을 정의할 수 있다.
BackOffPolicy
- FixedBackOffPolicy: 일정한 시간 간격으로 재시도
- ExponentialBackOffPolicy: 재시도할 때마다 지연 시간이 점차 증가
@Bean
public RetryTemplate retryTemplate() {
Map<Class<? extends Throwable>, Boolean> exceptionClass = new HashMap<>();
exceptionClass.put(RetryableException.class, true);
// FixedBackOffPolicy backOffPolicy = new FixedBackOffPolicy();
// backOffPolicy.setBackOffPeriod(2000); //지정한 시간만큼 대기후 재시도 한다.
SimpleRetryPolicy retryPolicy = new SimpleRetryPolicy(2,exceptionClass);
RetryTemplate retryTemplate = new RetryTemplate();
// retryTemplate.setBackOffPolicy(backOffPolicy);
retryTemplate.setRetryPolicy(retryPolicy);
return retryTemplate;
}
public class RetryItemProcessor2 implements ItemProcessor<String, Customer> {
@Autowired
private RetryTemplate retryTemplate;
@Override
public Customer process(String item) throws Exception {
Classifier<Throwable, Boolean> rollbackClassifier = new BinaryExceptionClassifier(true);
Customer result = retryTemplate.execute(new RetryCallback<Customer, RuntimeException>() {
@Override
public Customer doWithRetry(RetryContext context) throws RuntimeException {
// 설정된 조건 및 횟수만큼 재시도 수행
if(item.equals("1") || item.equals("2")){
throw new RetryableException("failed");
}
return new Customer(item);
}
}, new RecoveryCallback<Customer>() {
@Override
public Customer recover(RetryContext context) throws Exception {
// 재시도가 모두 소진되었을 때 수행
return new Customer(item);
}
},
new DefaultRetryState(item, rollbackClassifier));
//template - state 추가, skip 추가, backoff 추가,
return result;
}
}
정리
Reader
reader 는 재시도가 존재하지 않는다. 아이템을 건너 뛰거나 실패(예외) 처리 한다.
processor
ItemProcessor에서 예외가 발생하면 재시도 여부를 결정한다
RecoveryCallback: 재시도 횟수 초과 시 복구 로직을 수행한다
SkipPolicy: 오류가 발생한 아이템을 건너뛸지 결정하고, 이를 통해 스텝이 계속 진행될지, 실패할지를 결정한다
writer
ItemWriter에서 예외가 발생하면 재시도(RetryPolicy)를 수행합니다.
RecoveryCallback: 재시도가 실패하거나 한계를 초과하면 복구 작업을 수행합니다.
SkipPolicy: 복구에 실패한 항목을 건너뛸지 결정합니다.
'개-발 > Java + Spring + Kotlin' 카테고리의 다른 글
[spring] Cache 조회 성능을 최적화 Redis + Kotlin (0) | 2024.11.14 |
---|---|
[WebSoket] Spring + SocketJs 사용하기 ( 테스트 Html코드 공유 ) (0) | 2024.11.02 |
[Java] 정규표현식 regex 패키지 (0) | 2024.07.29 |
[Java] 정규표현식 regex (0) | 2024.07.29 |
[MSA] 분산 시스템 이벤트 소싱 구현 ( Transaction OutBox Pattern ) (0) | 2024.07.26 |