EBS 외부 API 연동 및 대용량 데이터 동기화 시스템 구축, 2023.10 ~ 2023.12 트러블슈팅
대량 반영 중 메모리 부족과 반영 누락을 원인부터 찾아 해소
10만+ 건 반영 중 나던 Heap OOM과 일부 원본의 반영 누락을 AOP 로깅 범위 조정, 청크 처리, 조회 방식 수정으로 해소
이슈 상황
- 3단계(내부 반영)에서 외부 콘텐츠 10만+ 건을 처리하다가 Heap OOM으로 배치가 멈췄습니다.
- 메모리 문제를 고친 뒤에도, 배치는 정상 종료됐는데 일부 원본이 반영되지 않고 남는 증상이 있었습니다.
원인 분석
메모리 부족
- 서버 로그와 코드로 원인을 확인했습니다.
- 공통 AOP 로깅이 메서드 인자를 문자열 하나로 이어 붙였고, 출력하지 않는 로그 레벨에서도 문자열은 먼저 만들어졌습니다.
- 10만+ 건 목록을 받는 반영 메서드에서 이 문자열이 힙을 채웠습니다.
반영 누락
- 반영이 끝난 원본은 처리 상태가 바뀌어 다음 조회 조건에서 빠집니다.
- 그런데 다음 페이지를 OFFSET(앞에서 건너뛸 행 수)으로 찾으면, 남은 행이 앞으로 당겨진 만큼 건너뛰는 행이 생겼습니다.
개선
| 문제 | 변경 전 | 변경 후 |
|---|---|---|
| 메모리 부족 | 반영 메서드도 공통 AOP 로깅 대상 | EBS 동기화 서비스와 매퍼 전체를 공통 AOP 로깅 대상에서 제외 |
| 메모리 부족 | 원본 전체를 한 번에 읽어 반영 | 원본을 1만 건씩 나눠 읽고 묶음마다 커밋 |
| 반영 누락 | 처리 상태 조건과 OFFSET으로 다음 페이지 조회 | OFFSET 없이 반복마다 “아직 처리하지 않은 행” 조건으로 앞 1만 건을 다시 읽음 |
결과
- 10만+ 건 반영 중 나던 Heap OOM을 해소하고, 초당 2,000건 이상 처리를 확인했습니다.
- 1만 건마다 커밋하고 반영하지 않은 행만 처리하므로, 중간에 실패해도 다시 실행하면 남은 행만 처리합니다.
- 같은 문제를 운영과 최대한 비슷한 환경과 설정에서 재현하고 저장 방식을 비교 측정한 내용은 재현과 비교 측정에 정리했습니다.