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) 위험 존재
- JdbcCusorItemReader, HibernateCursorItemReader
- 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
반응형
'TIL > Spring & Spring Batch' 카테고리의 다른 글
[Spring-Batch] 클라우드 환경에서의 Spring Batch (0) | 2023.10.14 |
---|---|
스프링 프록시 팩토리 (0) | 2023.05.24 |
댓글