HomeAboutMeBlogGuest
© 2025 Sejin Cha. All rights reserved.
Built with Next.js, deployed on Vercel
✍🏻
Learnary (learn - diary)
/Batch/
SpringBatch 작은 단위로 쪼개어 처리하는 Partition

SpringBatch 작은 단위로 쪼개어 처리하는 Partition

파티셔닝이란?멀티쓰레드 스텝과 무엇이다른가? 라고 의문이 들수 있습니다.핵심 컴포넌트구체적인 파티션 동작원리Refer

파티셔닝이란?


step을 쪼개서 처리속도를 높일 수 있는 방식입니다.
해당 기술은 단일 인스턴스, 멀티 인스턴스 기반으로 동작될 수 있습니다.
멀티인스턴스 기반으로 실행한다면, 반드시 이점에 유의함을 나타내고 있습니다.
  • 파티셔닝은 Remote Chunking 처럼 멀티인스터 기반으로 대량 처리 작업을 지시할 수 있게됩니다
  • RemoteChunking 방식에서 언급했던 것 처럼 분산되어져 있는 환경에서 사용하고자 한다면 데이터 전송이 반드시 내구성있고 안전하게 전달됨이 보장되어야 합니다.
 
 

멀티쓰레드 스텝과 무엇이다른가? 라고 의문이 들수 있습니다.

멀티쓰레드 스텝은 이름이 조금 바로 와닿지 않지만, 스텝안에 여러 reader → proccessor → writer 이 하나의 사이클을 여러번할때, 이 여러번을 멀티쓰레드로 동시에 처리하여 빠른 속도로 처리할 수 있는 이점이 있습니다.
 
멀티 쓰레드 스텝 방식
notion image
멀티쓰레드 방식은 기본적으로 PageItemReader 를 사용할 경우 Reader를 제외한 나머지 처리인 proccse, write 가 각 쓰레드 별로 처리되어 어느정도 속도향상을 기대합니다.
 
이에반해 파티션 기술을 위 멀티스레드 기반과 더불어 한단계 더 작은 단위인 slave step으로 쪼개서 멀티스레드보다 훨씬 빠른 속도를 기대할 수 있습니다.
 
notion image
💡
 
한개의 step으로 만약 배치처리를 한하면
step ——————————> 이렇게 필요하던 것이
 
4개의 istep으로 쪼개어지면서 각 스텝이 멀티스레드로 실행되면서 빠른 속도를 기대할 수 있습니다.
즉, 각 step 마다 범위를 분해해서, 동시에 처리되기 떄문입니다.
 
step1 —→
step2 ——→
step3 ——→
step4 ——→
 
목표 step ——>———> ———> ——→
 
 

핵심 컴포넌트


파티셔닝에서 핵심적인 전략은 job이 실행되고 여러 Step을 쪼개는 기술입니다.
이 핵심적인 기술에서 사용되어지는 모델은 2가지 있습니다.
PartitionHandler, StepExceutionSpliter
notion image
 
PateitionStep 컴포넌트로 부터 Step에 전달되기까지 위와 같은 처리가 있으며 , 가장 오른쪽에 있는 Step은 하나의 인스턴스 안의 step, 또는 멀티 인스턴스의 Worker 입니다.
 
ParitionStep
  • Master Step → Manger
ParititionHandler
  • 단일 인스턴스 환경에서 각 step을 멀티쓰레드 환경에서 실행시킴
StepExecutionSpliter
  • 단인 인스턴스 환경에서 멀티쓰레드만큼 각 Step에 Execution 환경을 만듬
  • 실제 스텝들을 쪼개면서 각 Exceution 환경을 생성해줌
 
해당 다이어그램에는 나와있지 않지만 실제로 이 컴포넌트를 구현해야 step이 실제로 쪼개어집니다.
자동으로 step을 나누는데는 서비스 특성마다 다를 수 있기에 해당 부분을 직접 구현해야합니다.
 
Paritioner
  • 각 step을 나누어 지는 기준을 설정하는 곳
 
 
 

구체적인 파티션 동작원리


  • 파티션을 나누는 기준은 개발자가 직접 작성해야합니다.
 
저는 비교적 처리를 균등하게 배분하기 위해 모듈려 연산 전략으로 파티션을 나누었습니다.
Modular : 2
파티션 2개
멀티쓰레드 2개
처리순서
worker-step0
worker-step1
ㅤ
ㅤ
ㅤ
thread10
ㅤ
1
1 page 조회
ㅤ
2 page 조회
ㅤ
…
10 page 조회
ㅤ
2
partition 1 (mod 2 = 1)
partition 2 (mod 2 = 0)
partition 1 (mod 2 = 1)
partition 2 (mod 2 = 0)
ㅤ
partition 1 (mod 2 = 1)
partition 2 (mod 2 = 0)
3
Processor
Processor
Processor
Processor
…
Processor
Processor
4
Writer
Processor
Writer
Processor
Writer
Writer
ㅤ
쓰레드가 2개이니 각 worker step이 쪼개어져 동시에 실행됩니다.
그랬을떄, 만약 제가 [1-100] id기반으로 파티션을 했다면
worker-step0 - id % 2 == 0 짝수인 경우 50개
worker-step1 - id % 2 == 1 홀수인 경우 50개
 
이렇게 되면 기존에 하나의 쓰레드가 [1-100] 까지 처리되는 것 보다
두개의 쓰레드가 동시에 50개씩을 처리하게 되니.! 이전 멀티쓰레드 스텝보다 빠른 성능향상을 기대할 수 있습니다.
 
단, PageItemReader를 사용한 경우
단, 여기서 멀티쓰레드 스텝이 같은 PageReader에서
현재 사용되어지고 있는 페이지가 같은 페이지가 아니라면! 동기화 때문에 잠시 스레드가 기다려야합니다.!
SpringBatch 멀티쓰레드 환경에서의 Reader, Writer 선별 주의사항
 
다른 그림으로 보면, 파티션이나, 쓰레드가 커질 수록 엄청난 성능향상을 기대할 수 있습니다.
notion image
 
 
전체적인 그림을 보면 전반적으로 이렇게 처리가됩니다.
notion image
 
item 처리과정까지 포함한 그림
notion image
 
단, 여기서 멀티쓰레드 스텝이 같은 PageReader 현재 사용되어지고 있는 페이지가 같은 페이지가 아니라면! 동기화 때문에 잠시 스레드가 기다려야합니다.!
 
결과적으로 Mutli Thread Step, Partition 으로 적용하면서 좋은 퍼포먼스를 얻게되었습니다.
- 초창기 멀티스레드 스텝 : 30% 개선 - 측정 데이터 양 10_000, 100_000, 1_000_000, 10_000_000 | 데이터량 | 싱글스레드 | 멀티 쓰레드 | 파티션 4쓰레드 | |------------|------------|---------------|----------------| | 1만 건 | 3.2s | 2.2 | 1.85 | | 10만 건 | 34s | 21s | 17.2s | | 100만 건 | 355s | 231s | 165s |

Refer


BaeldungBaeldungSpring Batch using Partitioner | Baeldung
Spring Batch using Partitioner | Baeldung

Spring Batch using Partitioner | Baeldung

Learn how to implement a job with parallel processing using Spring Batch.

BaeldungBaeldung
Scaling and Parallel Processing :: Spring Batch
Many batch processing problems can be solved with single-threaded, single-process jobs, so it is always a good idea to properly check if that meets your needs before thinking about more complex implementations. Measure the performance of a realistic job and see if the simplest implementation meets your needs first. You can read and write a file of several hundred megabytes in well under a minute, even with standard hardware.
Scaling and Parallel Processing :: Spring Batch
https://docs.spring.io/spring-batch/reference/scalability.html