1. 개요

오늘은 Spring Batch Partition에 대해 말해보려고 한다.


2. 방식

Spring Batch는 "chunk" 기반으로 처리를 한다. 이는 우선 row들을 하나씩 읽어서 출력을 위한 chunks들을 생성한다.

ItemReader가 read 역할을 담당하고, ItemProcessor가 처리하고 모은다.

아이템의 수가 commit interval에 도달하면 전체 chunk는 ItemWriter에 전달되어 commit된다.

일반적으로는 이런데 Spring Batch는 시리얼한 작업을 페러렐하게 수행할 수 있도록 파티셔너라는 기능을 제공한다.

파티션 이름은 임의로 줘도 되나 unique해야 한다.

<batch:handler grid-size="5" task-executor="taskExecutor" /> 에서 grid-size는 필수 파라메터이며 slave의 수다.

파티션된 수가 grid-size와 같을 필요는 없다. 적거나 많아도 된다.

총 데이터 사이즈가 200이고 grid-size가 4라고 하면 각 스레드는 다음과 같은 데이터를 처리한다.

  • 1번 스레드 : 0 ~ 50
  • 2번 스레드 : 50 ~ 100
  • 3번 스레드 : 100 ~ 150
  • 4번 스레드 : 150 ~ 200

3. 구성

이제 대량 배치에 대한 구성상의 포인트를 말해보려고 한다.

  • 먼저 초기화가 빨리 되야 한다. 즉, Job 단위별로 Spring Batch Job XML 파일을 구성하고 초기화한다.
  • 2) MyBatisCursorItemReader를 사용하여 대용량 데이터도 메모리 문제 없이 잘 처리해야 한다.
  • 3) MyBatis의 SqlSessionTemplate에서 batch 설정을 해야 한다.

<bean id="sqlSession" class="org.mybatis.spring.SqlSessionTemplate" destroy-method="clearCache">

        <constructor-arg index="0" ref="sqlSessionFactory" />

        <constructor-arg index="1" value="BATCH" />

</bean>

  • 4) 위에서 말한 Partition 기능을 잘 사용해야 한다.병렬 처리를 잘 해야된다는 뜻이다.