AI Briefing

그날, 우리의 배치는 왜 멈추었을까?

·2024.11.07 00:30

올리브영의 Spring Batch 작업 중 장애가 발생하여, 멀티스레드 환경에서의 트랜잭션 분리와 ThreadPoolExecutor 설정 오류를 분석했다.

올리브영의 특정 Batch 작업이 종료되지 않고 멈추는 장애가 발생했다. 초기에는 DB Deadlock을 의심했으나, 로그 확인 결과 특정 데이터 업데이트 이후 프로세스가 중단된 것을 확인했다.

원인 분석 결과, Spring BatchTasklet 내에서 호출되는 서비스 메소드에 @Transactional 설정이 누락되어 있었다. 이로 인해 SpringTransactionSynchronizationManagerThreadLocal을 통해 각 스레드마다 독립적인 트랜잭션을 생성하게 되었고, 결과적으로 의도치 않은 Propagation.REQUIRES_NEW와 같은 효과가 발생했다.

또한, ThreadPoolExecutor를 사용하여 멀티스레드로 작업을 병렬 처리하는 과정에서 설정된 RejectedExecutionHandler와 작업 큐의 구조가 장애의 핵심 원인 중 하나로 작용했다.

이 요약은 원문 이해를 돕기 위한 큐레이션입니다. 저작권은 원저작자에게 있으며, 정확한 내용과 맥락은 원문을 확인하세요.

요약 오류, 출처 표기 문제, 삭제 요청은 문의 · 건의로 알려주세요.