본문 바로가기
Spring/batch

spring boot, spring batch 정리 - 5편 대용량, low latency 를 위해 어떤 ItemReader 가 좋은가? (spring-batch 병렬 처리)

by 무대포 개발자 2020. 7. 11.
728x90
반응형

이 문서는 추후 다시 볼 목적으로 정리한 글입니다.
우연찮게 글을 읽어보게 됐는데 정리하면 좋을 것 같아서 기록.
혹시 읽다가 틀린 점이 있으면 알려주시면 감사하겠습니다.

JdbcCursorItemReader vs JdbcPagingItemReader

  • reference 에 나온 답변을 보면 이용하는 데이터베이스와 처리하는 모델에 따라 달라진다고 하는데 이 말이 이해가 안간다.
    • 추측하기로는 각 Reader 들은 fetchSize 를 통해 데이터를 받아오고 이는 네트워크를 거치는데 특정 DBMS 에서는 이 옵션이 안먹히기 때문이다.
    • pagingItemReader 는 paging 만큼 데이터를 가져와야하는데 fetchSize 옵션이 제대로 설정돼지 않으면 어떻게 동작할지를 모를테고.
    • 마찬가지로 cursorItemReader 도 fetchSize 만큼 가져와야하는데 특정 DBMS 에서 옵션이 작동안할 수 있으니 어떤 것이 성능이 좋은지 판단할려면 테스트 해보는 수밖에 없다.
  • 결국 위 내용의 결론은 테스트 환경을 만들어서 테스트 해보고 파악하는 것이 최선이라 생각된다.

CursorItemReader

  • cursor 처럼 row 의 포인터를 한 칸씩 이동해서 조회하는 개념
  • JdbcCursorItemReader 내부 동작은 다음과 같음. fetchSize 만큼 메모리로 가져오고, 메모리에서 one row 씩 읽고 메모리로 가져온 데이터를 다시 읽으면 fetchSize 테이블에서 다시 읽어오는 것.
  • 그렇기에 DB 에서 table 을 한 번에 조회해서 메모리에 한 번에 담았을 때 Out Of Memory 가 발생한다면, CursorItemReader 방식을 사용하면 좋다고 생각.
  • 멀티 스레드 환경 고려 x

PagingItemReader

  • 몇 번 부터 몇 번까지 읽을지 결정해서 해당 범위만큼 쿼리를 수행하여 데이터를 읽어오는 방법.
  • 예를 들면, 0~1000 번을 읽어오겠다면 해당 데이터를 읽어와서 메모리에 한 번에 올리는 방법.
  • MyBatisPagingItemReader 소스를 보니 synchronized 를 걸어서 readPage 하고 있음. 멀티 쓰레드 환경을 고려해서 만들었음.
  • 주의할 점은 한 번에 가져오는 PageSize 가 너무 크다면 out of memory 가 발생할 수 있다.

spring-batch parallel option

  • 아래 글에 보면 spring-batch 병렬 처리 옵션에 대표적인 것이 2개가 있다고 얘기함.
  • Multi Thread Step, Partitioning
  • Multi Thread Step 은 구성하기 쉽다고 설명. (TaskExecutor 만 설정해주면 되니)
    • 단, restart 기능을 구현하기에 복잡하다. (chunked 단위가 어떻게 실행될지 감이 안잡히니)
  • Partitioning 은 구성하기에 복잡하나 재시작을 보장한다 라고 설명하고 있다.
  • 내 생각은 다음과 같다. Multi Process 를 써서 Job 을 실행하는게 가장 best 이지 않을까.
    • Multi Thread 는 restart 기능 이 복잡.
    • Partitioning 기능도 로그 보기가 힘들고, 하나의 스텝이 장애가 나면 다른 스텝에도 영향을 미친다. (하나의 Process 이니)

reference

댓글