TIL/Spring & Spring Batch

Spring Batch 성능 최적화(1)

JoJobum 2023. 10. 28.

Batch - 특정 시간에 많은 데이터를 일괄 처리

  • 일괄 생성 : Read - Create - Write
  • 일괄 수정 : Read - Update - Write
  • 통계 : Read GroupBy - Write

기술 스택: Spring Batch, MySQL, Spring Cloud Data Flow, Redis, Kubernetes

 

 

대량 데이터 Read

Reader 개선이 큰 부분 차지

보통 복잡한 조회 조건으로 데이터를 가져오는 것이 성능에 크게 영향 줌

읽을 때는 항상 Chunk Processing

데이터의 양이 늘어나면 한번에 모든 데이터를 받을 수 없음

⇒ Chunk 단위로 받는다 1000만건 = 1000 * 만개의 chunk

그래서 Chunk 단위로 어떻게 읽어올건데?

  • Pagination Reader
    • Limit Offset 사용하여 해당 Page 데이터가 조회해옴
    • Limit Offset 값이 커지면 커질수록 느려지는 Limit Offset의 한계로 성능 좋지 않음
  • ZeroOffsetItemReader
    • Pk로 정렬후 Pk로 조건을 미리 걸어 Limit Offset 값을 항상 0이 될 수 있게 한다
  • 데이터를 애초에 조금씩 가져오는 Cursor 방식
    • JdbcCusorItemReader, HibernateCursorItemReader
      • Native Query
      • Fetch size 와 DB 설정 세팅시 매우 빠름
    • JPACursorItemReader 의 경우 데이터를 모두 읽고 서버에서 Cursor하기에 OOM(Out Of Memory) 위험 존재
  • Exposed + CusorItemReader,
    • Kotlin 기반 ORM 프레임워크
    • 자바로 사용 불가

 

데이터 Aggregation 처리

Join, GroupBy, Sum 쿼리 사용시

  • 연산과정이 쿼리에 의존적 ⇒ DB 부하 증가
  • 데이터 누적 ⇒ 데이터가 쌓이다 보면 중복도(Cardinality) 변경되고 실행계획이 바뀔 수 있기 때문에 튜닝 난이도 올라감
  • 쿼리 튜닝을 위해 과도한 인덱스 추가시 ⇒ INSERT, UPDATE 성능 저하, 저장 용량 차지

쿼리는 단순하게, 직접 Aggregation 해보자

그래도 최소 최종 결과만큼의 공간은 필요

ex) 1000만개 데이터로 50만개의 결과를 뽑고자 했을 때 50만개의 공간은 필요함

Redis를 선택한 이유

  • h 연산명령어 존재
  • 넉넉한 메모리
  • 빠른 저장, But 영구 저장 X인 점을 활용

Redis를 선택해서 생긴 문제

1000만 번 Sum연산 요청 = 1000만 번의 네트워크 I/O

⇒ Redis Pipeline을 사용하여 1000번의 Sum 연산을 한번에 보내 1000만번의 네트워크 I/O를 만번으로 줄임

 

 

대량 데이터 write

효율적이기 위한 방법

  • Batch Insert
    • 일괄로 쿼리 요청
    • DB Insert에 비해 네트워크 I/O가 큰 리소스 소모하기에
  • 명시적 쿼리
    • 필요한 컬럼만 Update
    • 영속성 컨텍스트 사용하지 않을 것

JPA와 배치의 궁합이 맞지 않아 JPA 사용X

  • JPA의 Dirty Checking과 영속성 관리 불필요함
    • 불필요한 복잡한 과정이 들어감
  • Update 시 불필요한 컬럼도 Update
    • JPA의 Dynamic Update 존재하지만 동적 쿼리를 생성하기에 오히려 성능 저하의 가능성 존재함
  • JPA Batch Insert 지원이 어려운 부분
    • Id 생성 전략이 IDENTITY인 경우 JPA에서 Batch Insert 사용 불가

 

Batch 구동 환경

스케쥴 Tool에 대한 문제

  • 자원 관리의 어려움 -항상 인스턴스가 떠있는 것이 아니기에 자원의 관리가 어려움
  • Batch 상태 파악이 어려움

⇒ Spring Cloud Data Flow 도입

Spring Cloud Data Flow

  • k8s와의 완벽한 호환
  • 시각적 모니터링 수월
    • 자체 대쉬보드
    • 그라파나 연동 가능

 

Ref)

Batch Performance 극한으로 끌어올리기: 1억 건 데이터 처리를 위한 노력 / if(kakao)2022 - YouTube

 

반응형

댓글