Scaling and Parallel Processing

2025. 10. 10. 18:16·Book/Spring Batch docs

❐ 1. Multi-thread Step


  • 앞에서 봄

 

 

 

 

 

❐ 2. Parallel Steps


  • 앞에서 봄

 

 

 

 

 

❐ 3. Remote Chunk


Remote Chunk란?

  • Reader/Processor와 Writer를 서로 다른 프로세스(노드)로 분리해서 실행하는 구조
    • 마스터 노드: 데이터를 읽고 나누어(Chunk 단위로) 전송
    • 워커 노드: 전달받은 Chunk를 실제로 Write (DB 저장 등)

 

언제 효과적일까?
  • Manager 컴포넌트는 하나의 프로세스로 동작하고, worker는 여러 개의 원격 프로세스로 동작함
  • 이 패턴은 Manager가 병목(bottleneck)이 되지 않을 때 가장 효율적
  • 따라서, 아이템을 읽는 작업보다 처리 작업이 더 비싼 경우에 특히 효과적

 

Manager
  • Manager는 Spring Batch의 Step 구현체
  • 청크(chunk) 단위의 아이템을 메시지 형태로 미들웨어(MQ 등)에 전송하는 일반화된 ItemWriter를 사용

 

➔ 즉, Manager는 일반적인 Step과 동일하게 동작하지만,

  • ItemReader → 데이터를 읽고
  • ItemProcessor → 데이터를 가공한 뒤
  • ItemWriter → 직접 DB에 쓰지 않고 메시지로 전송
@Bean
fun masterStep(): Step {
    return StepBuilder("masterStep", jobRepository)
        .chunk<String, String>(10, txManager)
        .reader(itemReader)
        .processor(itemProcessor)
        .writer(chunkMessageWriter) // DB X → MQ 전송
        .build()
}

 

Worker
  • Worker는 사용 중인 미들웨어(Message Broker) 에 맞는 표준 리스너(listener) 로 구현
    • 예를 들어 JMS를 사용한다면, Worker는 MessageListener 구현체가 된다.
  • 이들의 역할은
    • 수신한 청크 데이터를 처리하는 것
    • ChunkProcessor 인터페이스를 통해 표준 ItemProcessor 또는 ItemWriter를 사용하여 데이터를 처리

 

➔ 즉, Worker는 MQ로부터 메시지를 수신하고 그 내용을 “청크 단위로” 처리

  1. Manager → MQ로 Chunk 전송
  2. Worker → 메시지 수신 (MessageListener 역할)
  3. Worker 내부에서는 → ItemProcessor, ItemWriter를 사용해 데이터를 처리 (예: DB 저장)
@Component
class WorkerMessageListener(
    itemWriter: ItemWriter<String>
) : MessageListener {

    private val chunkProcessor: ChunkProcessor<String> =
        SimpleChunkProcessor(null, itemWriter)

    override fun onMessage(message: Message) {
        val items: List<String> = extractItems(message)
        chunkProcessor.process(items)
    }
}

 

언제 효과적일까?
  • Manager 컴포넌트는 하나의 프로세스로 동작하고, worker는 여러 개의 원격 프로세스로 동작함
  • 이 패턴은 Manager가 병목(bottleneck)이 되지 않을 때 가장 효율적
  • 따라서, 아이템을 읽는 작업보다 처리 작업이 더 비싼 경우에 특히 효과적

 

부하 분산
  • 아이템들은 동적으로 분할(dynamically divided)되어 미들웨어(Message Broker) 를 통해 분산
  • 따라서 모든 리스너(Worker)가 적극적으로 메시지를 소비하는(eager consumer) 방식이라면,
    • 자동으로 부하 분산(load balancing)이 이루어짐

 

 

 

 

 

❐ 4. Partitioning


Partitioning
  • Spring Batch는 Step execution을 분할해서 원격으로 실행할 수 있는 SPI도 제공
    • 쉽게 말하면, Step 자체를 여러 개로 쪼개서 각각 다른 프로세스(또는 서버) 에서 실행
    • SPI : Service Provider Interface
  • Worker들은 별도의 Step 인스턴스로 동작

 

Manager가 Worker에게 보내는 메시지는 내구성(durability), 전달 보장(guaranteed delivery)이 필요하지 않음.
  • 메시지를 MQ에 반드시 영구 저장할 필요가 없다는 뜻
  • 왜냐하면 Worker 실행은 Spring Batch의 JobRepository 메타데이터에 의해 관리되기 때문

 

이해하기 쉬운 예시
➔ 회원 테이블을 ID 기준으로 4개 구간으로 나누고, 각 구간을 다른 서버가 동시에 처리하고 싶다면?
  • Master
    1. StepPartitioner가 4개의 Partition(1~2500, 2501~5000, …) 생성
    2. PartitionHandler가 각 Partition을 원격 Worker로 전송
  • Workers
    1. 각 서버에서 동일한 Step 실행 (SELECT * FROM members WHERE id BETWEEN ...)
    2. 각각 결과 저장

 

Partitioning의 핵심 SPI 구조를 구성하는 3요소 이해하기

  • Spring Batch의 SPI의 구성
    1. PartitionStep이라는 특별한 Step 구현체 
    2. 환경에 맞게 구현해야 하는 두 개의 전략 인터페이스
      • StepExecutionSplitter : Step을 여러 Partition으로 나누는 전략
      • PartitionHandler : 각 Partition을 분배하고 Worker에서 실행되게 하는 전략

 

 

 

🌀 4-1. PartitionHandler

  • Manager가 만든 각 StepExecution(파티션 단위 작업)을 실제로 Worker에게 전달하는 역할
    • 멀티 스레드 방식으로 Step을 병렬 실행해주는 기본 PartitionHandler를 제공함
    • 데이터를 어떻게 분할(Split) 할지, 또는 여러 Step 실행 결과를 어떻게 합칠(Aggregate) 지 알 필요 없음.
  • 일반적으로 PartitionHandler는 복구(resilience) 나 장애조치(failover) 를 다룰 필요도 없음.
    • 왜냐하면 이런 기능들은 대부분 사용 중인 메시징 시스템이나 그리드 플랫폼이 담당하기 때문
  • 메시징이나 Worker 실패와 상관없이, 부분 재실행 가능 
    • JobRepository에 저장된 메타데이터를 기준으로 “어떤 파티션이 완료됐는지” 를 알고 있으므로
  • PartitionHandler 인터페이스는 다양한 환경에 맞게 구현할 수 있음.

 

 

🌀 4-2. Partitioner

Partitioner란?
  • 새로운 StepExecution을 실행하기 위한 ExecutionContext를 생성하는 것
    • 즉, "작업을 어떻게 나눌지”만 정의

 

인터페이스 정의
public interface Partitioner {
    Map<String, ExecutionContext> partition(int gridSize);
}

// "partition1" -> { startId=1, endId=1000 }
// "partition2" -> { startId=1001, endId=2000 }
  • gridSize
    • 나눌 파티션 개수 (예: 4개라면 4개의 StepExecution 생성)
  • return Map
    • key: 파티션 이름
    • value: ExecutionContext (해당 파티션에서 사용할 변수들)

 

 

 

🌀 4-3. Binding Input Data to Steps

Partitioner가 생성한 ExecutionContext 데이터를 Step에 바인딩하는 방법

  • Spring Batch에서 Partitioning을 사용할 때, 각 파티션은 서로 다른 데이터를 처리해야 함.
  • 예를 들어,
    1. 파티션마다 다른 파일을 읽거나
    2. 서로 다른 ID 구간을 처리하거나
    3. 날짜별로 분리된 데이터를 다루거나
  • 이때 핵심은 바로
    • Partitioner가 생성한 ExecutionContext를 실제 Step의 Reader나 Writer에 동적으로 바인딩하는 것
  • Partitioner가 만든 ExecutionContext 데이터를 @StepScope Bean과 SpEL로 런타임에 바인딩하면
          하나의 Step으로 여러 파티션 데이터를 유연하게 처리할 수 있다.

 

'Book > Spring Batch docs' 카테고리의 다른 글

Common Batch Patterns  (0) 2025.10.10
Retry  (0) 2025.10.10
Item processing  (0) 2025.10.09
ItemReaders and ItemWriters  (0) 2025.10.07
Configuring a Step  (0) 2025.10.06
'Book/Spring Batch docs' 카테고리의 다른 글
  • Common Batch Patterns
  • Retry
  • Item processing
  • ItemReaders and ItemWriters
gilbert9172
gilbert9172
gilbert9172 님의 블로그 입니다.
  • gilbert9172
    バックエンド
    gilbert9172
  • 전체
    오늘
    어제
    • All Categories (207)
      • 우테코 7기 (21)
        • 1주차 (8)
        • 2주차 (5)
        • 3주차 (6)
      • Langauge (6)
        • Java (3)
        • Kotlin (3)
      • Back-End (13)
        • SpringBoot (1)
        • Trouble Shooting (0)
        • Setup & Configuration (1)
        • SQL (3)
        • Redis (8)
      • Architecture (6)
        • Multi Module (1)
        • DDD (5)
      • CS (30)
        • Data Structure (6)
        • Operating System (0)
        • Network (12)
        • Database (10)
        • Design Pattern (2)
      • Algorithm (78)
        • 내용 정리 (18)
        • 문제풀이 (60)
      • DevOps (6)
        • AWS (5)
        • Git (1)
      • Front-End (1)
        • Trouble Shooting (1)
      • Project (6)
        • 페이스콕 (6)
      • Book (39)
        • 친절한 SQL 튜닝 (9)
        • 데이터 중심 애플리케이션 설계 (14)
        • 이벤트 기반 마이크로서비스 구축 (6)
        • Spring Batch docs (10)
        • Quartz docs (0)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    부분단조성
    binarysearch
    Two-Pointer
    오블완
    greedy
    sliding-window
    Back-Tracking
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.2
gilbert9172
Scaling and Parallel Processing
상단으로

티스토리툴바