(Spring Batch) 병렬 처리 방법 모음
Spring Batch에서 지원하는 배치 병렬 처리 방식
- AsyncItemProcessor / AsyncItemWriter → 한 step 내에서 processor만 병렬 수행해야 할 때
- Multi-threaded Step → 한 step 내에서 reader, processor, writer를 chunk 단위로 병렬 수행해야 할 때
- Parallel Steps → 여러 step들을 병렬로 수행해야 할 때
Externalizing Batch Process Execution → 외부 remote 서버에서 병렬 수행 필요할 때. (master-worker 모델)
- Remote Chunking of Step→ 스텝 내의 Processor, Writer가 무거운 작업이라 외부 remote 서버들에서 병렬로 돌리고 싶을 때
- Remote Partitioning (Partitioning a Step)**→ Reader 부터가 무거운 작업이라 Reader를 포함한 Step 전체를 쪼개 외부 remote 서버들에서 병렬로 돌리고 싶을 때. *꼭 외부가 아니라 local thread로도 가능
https://docs.spring.io/spring-batch/docs/current/reference/html/scalability.html
AsyncItemProcessor / AsyncItemWriter
- https://docs.spring.io/spring-batch/docs/4.2.x/reference/html/index-single.html#asynchronous-processors
- https://docs.spring.io/spring-batch/docs/current/api/org/springframework/batch/integration/async/AsyncItemProcessor.html
reader, writer는 단일 thread로 동작하고 processor 부분만 taskExecutor가 붙어 병렬 처리하게 된다.
- processor 내에서 전체를 감싸 병렬처리 하는 것과 비슷한 효과인데, AsyncItemProcessor/AsyncItemWriter가 기존 processor/writer에 delegate 하는 방식이기 때문에 기존 로직 변경 없이 쉽게 사용 가능 하다.
- reader가 병렬이 아니라서 중단 지점 부터 재시작 가능하다.
- 그래서 Multi-threaded Step 보다 선호하는 방법.
- 보통 배치에서 오래 걸리는 부분은 processor이기 때문에, processor만 병렬로 처리해도 충분한 경우가 많다.
Multi-threaded Step
- https://jojoldu.tistory.com/493
- https://stackoverflow.com/questions/36645648/spring-batch-corepoolsize-vs-throttle-limit
- Spring Batch Multi-threaded Step 사용 시 chunk 구성에 대한 오해
- reader가 병렬이기 때문에, 중단 지점 부터 재시작이 불가능하다.
thread safe한 Reader, Writer를 사용해야 한다.
AbstractPagingItemReader::doRead
에서 synchronized block을 사용하기 때문에 이를 상속한 PagingItemReader는 기본적으로 thread-safe다.- FlatFileItemReader는? sync wrapping이 필요하다.참조
- thread는 일단 CorePoolSize 만큼 뜨고 각자 Chunk를 만드려 시도하기 때문에 ThreadSafe 해야한다. 배타적으로 접근해야 paging이 틀어지는 것을 막을 수 있다.
- 동시 접근하는 변수(e.g., count)가 있는 경우 주의한다. (atomic 필요)
- 너무 많은 thread가 돌게 되면 db connection pool이 고갈 될 수도 있는 등 주의가 필요하다.
TaskExecutor의 종류
- All Known Implementing Classes 부분 참조
https://www.baeldung.com/java-threadpooltaskexecutor-core-vs-max-poolsize
Parallel Steps
- [(step1,step2)와 step3]을 병렬 처리 하고 싶을 때.
FlowBuilder::split / SimpleJobBuilder::split
을 이용- https://godekdls.github.io/Spring%20Batch/scalingandparallelprocessing/#72-parallel-steps
- https://godekdls.github.io/Spring%20Batch/configuringastep/#535-split-flows
Remote Chunking
https://godekdls.github.io/Spring%20Batch/scalingandparallelprocessing/#73-remote-chunking
https://godekdls.github.io/Spring%20Batch/springbatchintegration/#remote-chunking
Remote Partitioning
https://godekdls.github.io/Spring%20Batch/scalingandparallelprocessing/#74-partitioning
https://godekdls.github.io/Spring%20Batch/springbatchintegration/#remote-partitioning
참고
https://backtony.github.io/spring/2022-01-29-spring-batch-11/
https://godekdls.github.io/Spring%20Batch/scalingandparallelprocessing/
https://docs.spring.io/spring-batch/docs/4.2.x/reference/html/index-single.html#scalability