배치 아키텍처
애플리케이션 레이어
- 개발자가 개발한 코드를 나타냄
- 대부분 코어 레이어와 상호 작용 함
코어 레이어
- 배치 영역을 구성하는 실제적인 여러 컴포넌트로 이뤄짐
인프라스트럭처 레이어
- ItemReader, ItemWriter 제공
- 재시작과 관련된 문제를 해결할 수 있는 클래스와 인터페이스 제공
잡과 스텝
스텝
- 스텝은 스프링 배치에서 가장 일반적으로 상태를 보여주는 단위
- 각 스텝은 잡을 구성하는 독립된 작업의 단위
- 스텝은 Tasklet 기반 스텝과 Chunk 기반의 스텝이라는 두 가지 유형이 있음
스텝을 분리함으로써 얻는 기능
- 유연성
- 재사용이 가능하게 구성할 수 있도록하는 여러 빌더 클래스를 제공함
- 유지 보수성
- 각 스텝은 이전, 다음 스텝과 독립적이므로 다른 스텝에 영향을 미치지 않음
- 단위 테스트, 디버그, 변경에 용이하며 재사용 가능
- 확장성
- 하나의 스텝 내에서 처리할 일을 여러 스레드에 나눔으로써 해당 스텝의 코드를 병렬로 실행할 수 있음
- 신뢰성
- 다양한 오류 처리 방법을 제공함
- 예외 발생 시 재시도 또는 건너뛰기(skip) 등의 동작이 가능함
잡 실행
- 스프링 배치의 많은 컴포넌트가 잡의 실행에 서로 상호 작용함
Job Repository
- 다양한 배치 수행과 관련된 수치 데이터(시작 시간, 종료 시간, 상태, 읽기/쓰기 횟수 등) 및 잡의 상태를 유지 관리 함
- 일반적으로 관계형 데이터베이스를 사용하며 스프링 배치 내의 대부분의 주요 컴포넌트가 공유함
JobLauncher
- 잡을 실행하는 역할을 담당
- 잡의 재실행 가능여부 검증, 잡의 실행 방법, 파마리터 유효성 검증 등의 처리 수행
Job
- 잡은 구성된 스텝 목록에 따라 각 스텝을 실행함
- 스프링 배치는 JobRepository 내에 있는 JobExecution, StepExecution 에 상태를 갱신함
병렬화
잡을 병렬화하는 방법에는 다중 스레드 스텝을 통한 작업 분할, 전체 스텝의 병렬 실행, 비동기 ItemProcessor/ItemWriter 구성, 원격 청킹, 파티셔닝 이 있다.
다중 스레드 스텝
- 스프링 배치에서 잡은 청크(chunk)라는 블록 단위로 처리되도록 구성됨
- 각 청크는 독립적인 트랜잭션으로 처리 됨
- 각 청크는 연속해서 처리 후 커밋하며 이 과정을 모든 레코드가 처리될 때 까지 반복함
- 10,000 개의 레코드가 있을 때, 1 → 50 처리 후 커밋, 51 → 100 처리 후 커밋 의 반복
- 스프링 배치를 사용하면 작업을 병렬로 실행해 성능을 향상 시킬 수 있음
- 세 개의 스레드를 사용하도록 구성하면, 위 그림과 같이 처리량을 이론적으로 3배 늘릴 수 있음
병렬 스텝
- 스텝 자체를 병렬로 실행하는 것
비동기 ItemProcessor/ItemWriter
- 스탭 내의 ItemProcessor 에서 복잡한 계산이나 원격 서비스 호출 등을 할 때에 병목현상이 발생 할 수 있음
- AsynchronousItemProcessor 는 ItemProcessor 호출 결과를 반환하는 대신, 각 호출에 대해 java.util.concurrent.Future 를 반환함
- 반환된 Future 목록은 AsyncronousItemWriter 로 전달된 후 실제 결과를 얻어내어 이름 ItemWriter 에 전달함
원격 청킹
- 처리의 일부분을 여러 JVM을 통해 수평으로 확장하는 방법임
- 입력은 마스터 노드에서 표준 ItemReader 를 사용해 이뤄짐
- 그 이후 지속 가능한 통신 형식(래빗 MQ 또는 액티브MQ 와 같은 메시지 브로커)을 통해 메시지 기반 POJO로 구성된 원격 워커 ItemProcessor 로 전송됨
- 마스터에서 데이터를 읽고 원격 워커에서 처리한 다음 다시 마스터에게 전송하는 구조임
- 네트워크 사용량이 매우 많아질 수 있음에 유의해야 함
- 실제 처리에 비해 I/O 비용이 적은 시나리오에 적합함
파티셔닝
로컬 파티셔닝
- 워커의 스레드 사용
원격 파티셔닝
- 마스터 및 원격 워커를 사용
- 마스터는 워커의 스텝 수집을 위한 컨트롤러 역할만 하게 됨
- 각 워커의 스텝은 독립적으로 동작하며 마치 로컬로 배포된 것처럼 동일하게 구성됨
- 모든 워커가 각각 맡은 일을 완료하면 마스터 스텝이 완료된 것으로 간주됨
- JobRepository가 복제된 작업이 없고 모든 작업이 완료됐음을 보장하기 때문에 내구성 있는 지속적인 통신이 필요 없음
이 포스팅은 스프링 배치 완벽가이드 2/e 의 내용을 요약 정리한 것 입니다.