□ Multi-threaded Step (single-process)
- 병렬 처리를 시작하는 가장 간단한 방법은 TaskExecutor을 Step 구성에 추가하는 것
- Spring Batch는 대부분 다중 스레드 환경을 위해 설계되지는 않았으므로 주의 필요
- 가장 단순한 실행자는 SimpleAsyncTaskExecutor
- 스레드 풀을 완전히 사용하기 위해 스로틀링 제한을 늘릴 수 있음
@Bean
public TaskExecutor taskExecutor() {
return new SimpleAsyncTaskExecutor("spring_batch");
}
@Bean
public Step sampleStep(TaskExecutor taskExecutor, JobRepository jobRepository, PlatformTransactionManager transactionManager) {
return new StepBuilder("sampleStep", jobRepository)
.<String, String>chunk(10, transactionManager)
.reader(itemReader())
.writer(itemWriter())
.taskExecutor(taskExecutor)
.throttleLimit(20)
.build();
}
□ Parallel Steps (single-process)
- 병렬 처리가 필요한 애플리케이션 로직을 step으로 분할하여 개별 단계에 할당하여 처리
- 밑의 코드는 총 3단계로 나누어져 있으며 병렬로 1,2단계를 실행
@Bean
public Job job(JobRepository jobRepository) {
return new JobBuilder("job", jobRepository)
.start(splitFlow())
.next(step4())
.build() //builds FlowJobBuilder instance
.build(); //builds Job instance
}
@Bean
public Flow splitFlow() {
return new FlowBuilder<SimpleFlow>("splitFlow")
.split(taskExecutor())
.add(flow1(), flow2()) // 둘 다 실행
.build();
}
@Bean
public Flow flow1() {
return new FlowBuilder<SimpleFlow>("flow1")
.start(step1())
.next(step2())
.build();
}
@Bean
public Flow flow2() {
return new FlowBuilder<SimpleFlow>("flow2")
.start(step3())
.build();
}
@Bean
public TaskExecutor taskExecutor() {
return new SimpleAsyncTaskExecutor("spring_batch");
}
□ Remote Chunking of Step (multi-process)
- 하나의 Manager와 여러 개의 Worker가 원격으로 분리된 구조로 Manager에 부하가 발생하면 취약한 구조
- Manager가 Item을 읽음
- Worker가 ItemProcessor와 ItemWriter를 사용하여 Chunk Processor 인터페이스를 통해 항목의 Chunk 단위로 처리하여 Item을 쓰기 처리
□ Partitioning a Step (single or multi-process)
- Spring Batch는 Step 실행을 분할하고 원격으로 실행하기 위한 SPI(동기식 직렬 통신 방식)을 제공
- Manager는 하나의 Step 인스턴스라고 생각
- 여러개의 Worker는 모두 동일한 인스턴스로 Manager를 대신하여 작업하는 형태
- 예를 들어, 아래 그림처럼 6개의 Worker가 있고 읽어야하는 파일이 40개가 있다고 생각해보자. 처음엔 Step에 대한 StepExecution이 생기고 각각의 파티션(파일?)에 대한 Execution이 생성된다. 그러면 Worker가 각 파티션의 StepExecution을 수행한다. Worker가 모든 파티션을 수행하고 나면 Job이 종료된다.
- Remote Chunking of Step와 이 것은 보통 Spring Integration을 활용하여 원격으로 분할함
- 나눠진 PartitionStep은 아래와 같이 PartitionHandler와 StepExecutionSplitter 인터페이스로 구성되어 있음
- PartitionStep이 실행을 주도하며 Step이 원격 Worker이므로 잠재적으로 이 역할을 수행하는 많은 개체 및 프로세스가 존재
- 아래 코드와 같이 gridSize를 설정하여 포화되는 것을 방지
@Bean
public Step step1Manager() {
return stepBuilderFactory.get("step1.manager")
.<String, String>partitioner("step1", partitioner())
.step(step1())
.gridSize(10)
.taskExecutor(taskExecutor())
.build();
}
'스프링' 카테고리의 다른 글
Spring Batch - 1 (0) | 2023.02.21 |
---|