3. [A]씨의 일을 인수인계 받은 [B] 개발자
로직이 어디있
지?
새벽에 도는 배치가
실패
LEGACY BATCH PROBLEM
4. 기존 배치 개발의 문제점
1. 읽어오는 데이터 형태의 변화에 대응하기 힘들다. (CSV -> DB)
2. DB에 한꺼번에 COMMIT되는 건수가 너무 많았다.(트래픽 증가)
3. 배치 통계를 위한 변수를 할당하고 로깅 하는 코드 추가.
4. 유지보수가 힘들다. (비지니스 로직 어디있는거지?)
5. 실패 했을때 후 처리가 부족했다.(B씨 새벽에 배치가 실패)
LEGACY BATCH PROBLEM
7. SPRING BATCH HISTORY
Spring batch 는 컨설팅 회사인 엑센츄어
(Accenture)의 실무 경험을 바탕으로
Spring IO 팀과 함께 개발을 했으며, 이미
많은 회사에서 안정적으로 사용 중
Spring Batch는 로깅 / 추적, 트랜잭션 관리, 작업 처리
통계, 작업 재시작, 건너 뛰기 및 자원 관리를 포함
ABOUT SPRING BATCH
17. SPRING BATCH - DEMO
@ENABLEBATCHPROCESSING
- jobBuilderFactory와 stepBuilderFactory 빈을 제공
- 생성 되는 TransactionManager 는 DataSourceTransactionManager 사용
19. firstName 과 lastname을 대문자로 만들어주는 PersionItemProcessor
Item 처리할 데이터의 가장 작은 구성 요소
SPRING BATCH - DEMO
PROCESSOR - BUSSINESS LOGIC
20. SPRING BATCH - CHUNK
CHUNK란
Chunk oriented processing refers to reading the data one at a time, and
creating 'chunks' that will be written out, within a transaction boundary.
One item is read in from an ItemReader, handed to an ItemProcessor, and
aggregated.
Once the number of items read equals the commit interval, the entire chunk
is written out via the ItemWriter, and then the transaction is committed.
하나의 TRANSACTION안에서 처리할 ITEM의 덩어리.
21. CHUNK 의 역할
Reader - Item 하나씩
Writer - chunk에 설정한 개수만큼
SPRING BATCH - CHUNK
22. CHUNK 개수에 따른 속도 변화
chunk 10일때
수행시간 : 1초
chunk 100일때
수행시간 : 0.1초
SPRING BATCH - CHUNK
32. SPRING BATCH SOLUTION
BATCH 를 통해 해결.
1. 읽어오는 데이터 형태의 변화에 대응하기 힘들다. (CSV -> DB)
-> ITEMREADER라는 인터페이스를 통해 비교적 쉬운 방식으로 접근 가
능
2. DB에 한꺼번에 COMMIT되는 건수가 너무 많았다.
-> CHUNK ORIENTED PROCESSING 으로 COMMIT 되는 양을 조절 할
수 있다.
3. 배치 통계를 위한 변수를 할당하고 로깅 하는 코드 추가.
-> BATCH TABLE 에 통계에 필요한 값들이 알아서 저장된다.
4. 유지보수가 힘들다. (비지니스 로직 어디있는거지?)
-> PRECESS, READ, WRITER를 보면 어떻게 되있는지 쉽게 찾을 수 있
다.
5. 실패 했을때 후 처리가 부족했다.
-> EXECUTIONCONTEXT 라는 저장 공간에 저장된 정보를 활용해서 처
리.
33. ETC
추가 - 대용량 배치 처리 병렬 수행
1. 멀티쓰레드(Multi-threaded Step)
2. Parallel Steps.
3. 파티셔닝(Partitioning)
두번째 발표자 -> 알서포트 백앤드 -> 스터디 주제를 배치 -> -스터디 주제 정할때 자유주제 > 일하면서 많이 들음 -> 그러나 정확히 먼지 모름. -> 마침 도입해야함. -> 스터디를 준비하면서 배치를 접해보지 않거나
기존 배치 프로그램의 문제를 하나의 상황을 예를 들어 어떤문제가 있었는지 알아보자 ->
A씨는 배치 개발 요청 -> 요구사항중 하나는 csv 에서 읽어오는 방식 ->
개발 과정에서 갑자기 이유없이 배치가 정지되는 상황. -> 확인 결과 한꺼번에 많은 양이 몰려서 발생한 에러->
이를 대비하기 위해 통계페이지를 추가하기로 하였고 A씨는 배치 통계를 위한 변수를 할당하고 로깅 하는 코드 추가
현업에서 배치프로그램을 쓰다가 수정요청사항이 와서 A씨의 후임 개발자 B씨가 배치 프로그램을 수정해야 하는 상황이 발생했다.
수정요청사항 -> sql -> 로직이 어디 -> 야근을함 -> 집에갔는데 새벽에 배치가 실패 ->
저녁이 없는 삶이라고 불평불만 -> 역시 개발자는 3d
기존배치는 이런문제점 -> 스프링 배치는 이를 해결함 -> 배치가 이 점을 어떻게 해결하는지 하나하나 보여줌.
자료를 찾다 인터넷에 재미있는글 -> 배치와 쿼츠는 다름 -> 알면 참 쉬움
Job 은 배치 프로세스에서 캡슐화 되있는 entity이고 단순히 Step을 위한 컨테이너
JobLauncher로 작업을 실행
동기, 비동기 방식.
JobInstance
다이어그램의 ‘EndOfDay’작업과 같이 하루가 끝날 때 한 번 실행해야하는 배치 작업을 생각해보면, 하루에 하나의 ‘EndOfDay’작업이 존재하고, 이것은 1 월 1 일 및 1 월 2 일이 실행됩니다. JobInstance는 실패했을때 여러번 돌릴 수 있으며, 성공시 생명주기가 끝나게 됩니다.
EndOfDay 을 예로 들면 만약 01-01-2008에 돌리는 Job을 실패했을때, 같은 파라미터(01-01-2008 )로 돌리면 새로운 JobExecution 가 생성
JobExecution 의 코드를 보면 상태, 시작시간, 종료시간이 있고 기타 필요한것들이 들어 있습니다.
정리하면 Job과 JobParameter가 JobInstance를 만들고 이게 실행되는데 실행되는 시도가 JobExecution1 입니다.
이때 JobInstance가 실패해서 한번 더 시도 하면 JobExecution2 가 생기고 JobExecution에 위에와 같은 메타 정보가 저장
모든 Job은 하나 이상의 단계로 이루어져 있습니다. Step에는 실제 배치 처리를 정의하고 제어하는 데 필요한 모든 정보가 들어 있습니다.
Step Execution 하나의 step을 실행하는 한번의 시도. 시작시간, 종료시간,상태, 종료상태, commitCount, itemCount 의 속성을 가지고, Job 과 Step 그 연관관계와 개념
Job execution 을 보고 예시와 내용들은 링크.
에러났을때 db에 저장됨 - 2번해결
이제 실제 Batch job을 돌려봅시다. Spring batch는 개발자가 비지니스 로직에 집중할수 있도록 많은 유틸리티 클래스를 제공합니다.
EnableBatchProcessing은 jobBuilderFactory와 stepBuilderFactory 빈을 제공합니다.
Job은 step 으로 이루어져 있고 Step은 reader, processor, writer로 이루어져 있습니다.
JobInstance 는 Job + Job Parameter이기 때문에 Job Parameter를 자동으로 Increment 하기 위해서 사용합니다.
Step에서는 한번에 쓸 데이터 양을 정의 합니다. 이 경우에는 한번에 최대 10개 item의 record를 기록합니다.”chunk”의 입력 및 출력 유형을 나타내며, ItemReader<~>및 ItemWriter<~> 와 일치합니다.
chunk 트렌젝션 단위
- Chunk 중심 처리는 한번에 하나씩 데이터를 읽는 것이며, 트랜잭션 경계 내에서 작성되는 'chunks'를 생성하는 것을 의미합니다
- 하나의 item은 ItemReader에서 읽어지고, ItemProcessor에 처리되고, 집계된다.
- 읽은 항목의 수가 commit interval과 일치하는 경우에는, chunk을 거쳐 ItemWriter를 통해 쓰여지고, 트랜잭션이 커밋 됩니다.
Step은 items를 읽고 쓰는데 있어서 트랜잭션 매니져를 이용해 주기적으로 커밋을 수행한다. Commit-interval이 1이라면 하나의 아이템들은 개별적으로 커밋이 수행될 것이다. 그러나 많은 상황에서 트랜잭션을 열고 커밋을 수행하는 비용은 비싸다
출처: http://opennote46.tistory.com/82 [욱'S 노트]
reader – sample-data에 있는 csv파일을 읽어서 하는 부분
1번단점 Reader csv-> db 해결
사진 수정 count 1 도 있어야함.
job 에 걸린 listener를 보면 끝난 상태를 체크하는 부분을 JobExecution에서 status 를 가져오는것을 알수 있습니다.
Job 은 배치 프로세스에서 캡슐화 되있는 entity이고 단순히 Step을 위한 컨테이너
projet에서 job은 xml이나 java base 컨피그 설정을 할 수 있습니다.
JobLauncher로 작업을 실행하고 현재 실행중인 프로세스에 대한 메타 데이터를 JobRepository에 저장
1. Step 구성으로 수행한 결과 각 청크단위의 reading, processing, writing 과정이 분리된 쓰레드에서 수행된다. 즉, 처리시 순서를 보장하지 않으며 Chunk는 단일 쓰레드 수행과 비교해 item 들이 연속적이지 않다.
2. 스텝을 병렬로 수행.
3.병렬로 chunk 단위(각 slave들)을 동시에 수행
파티 셔닝에 대한 예제와 정확 이론.
멀티쓰레드로 돌아도 트렌젝션의 범위.
멀티스레드 환경의 트렌젝션
트렌젝션의 범위가 chunk이나 아니냐.
스레드가 job 단위로 도냐 step로 도냐
- 스레드가 job 단위로 돔
Parallel Step은 Job이 여러 Step으로 구성되어 있을 때 독립적으로 진행되어도 무관한 Step을 병렬처리
출처: http://marobiana.tistory.com/131 [Take Action]