DB 커넥션 문제 해결로 알림톡 발송 시스템 안정화

by DD
1주 전
조회수 68

장보기 지원금 소멸 알림 발송 시, 대량의 대상자 처리로 인해 배치 처리 시간 증가 문제가 발생함

병렬 처리 구조 적용을 통해 초기 처리 시간 단축을 시도했으나, DB 커넥션 타임아웃(DB Connection Timeout) 문제 발생

Spring Batch 기반 배치 시스템에서 Chunk 트랜잭션 책임 범위 조정을 통해 DB 커넥션 점유 시간 최적화

ResourcelessTransactionManager를 활용하여 메시지 발송 대기 시간과 DB 커넥션 점유 시간 분리

결과적으로 대량 발송 시 배치 시스템의 안정성(System Stability)을 확보하고, 고객에게 알림을 안정적으로 전달

DB 커넥션 타임아웃(DB Connection Timeout) 문제의 근본 원인

본문에서는 장보기 지원금 소멸 알림 발송 배치 시스템에서 간헐적으로 발생하는 DB 커넥션 타임아웃(DB Connection Timeout) 문제의 원인을 분석한다. 초기에는 메시지 발송 API의 응답 지연을 의심했지만, 실제 원인은 Chunk 처리 흐름DB 커넥션 점유 구조에 있었다.

기존 구조: 대상자 조회, 메시지 생성, API 호출을 하나의 Chunk 내에서 처리

문제점: API 응답 대기 시간 동안 DB 커넥션(DB Connection)을 점유하여 커넥션 풀(Connection Pool) 고갈 유발

결과: 대량 발송 시 DB 커넥션 부족으로 인해 배치 실패 발생

결론적으로, API 호출 자체보다는 DB 리소스(DB Resource) 점유 시간이 문제의 핵심이었다.

Spring Batch Chunk 구조와 트랜잭션 관리

글에서는 Spring Batch의 Chunk 기반 처리 구조와 트랜잭션 관리 방식을 설명한다. Spring Batch는 Reader, Processor, Writer로 구성된 Chunk 단위로 데이터를 처리하며, 각 Chunk는 트랜잭션(Transaction)으로 묶여 데이터 일관성(Data Consistency)을 보장한다.

Reader: DB에서 발송 대상자 조회

Processor: 메시지 데이터 생성

Writer: 메시지 발송 API 호출

문제점: Chunk 트랜잭션 내에서 API 호출이 이루어지면서 DB 커넥션 점유 시간 증가

이러한 구조는 데이터 처리의 안정성을 높이지만, API 호출과 같은 외부 I/O 작업이 포함될 경우 DB 리소스(DB Resource) 고갈을 초래할 수 있다.

ResourcelessTransactionManager를 활용한 트랜잭션 책임 분리

본문에서는 Spring Batch의 ResourcelessTransactionManager를 활용하여 Chunk 트랜잭션의 책임 범위를 조정하는 방법을 제시한다. ResourcelessTransactionManager는 별도의 트랜잭션 리소스를 관리하지 않아, DB 커넥션 점유 시간을 최소화할 수 있다.

기존: Chunk 트랜잭션 내에서 DB 조회 및 API 호출

개선: DB 리소스 사용 구간과 메시지 발송 대기 구간 분리

ResourcelessTransactionManager 적용: DB 커넥션 점유 시간을 줄여 Connection Pool 부담 완화

결과: 대량 발송 시에도 DB 커넥션 타임아웃(DB Connection Timeout) 발생 가능성을 줄임

이러한 방식은 API 호출의 응답 시간에 영향을 받지 않고, 배치 시스템의 안정성(System Stability)을 향상시킨다.

배치 시스템 성능 개선을 위한 병렬 처리

글에서는 배치 시스템의 성능 개선을 위해 병렬 처리 구조를 적용한 사례를 소개한다. 초기에는 단일 스레드로 처리하던 작업을 여러 스레드로 분산하여 처리 시간을 단축했다.

병렬 처리 적용: 여러 스레드(Thread)가 발송 작업을 분담하여 전체 처리 시간 감소

문제점: 병렬 처리 후 DB 커넥션 타임아웃(DB Connection Timeout) 문제 발생

원인: 병렬 처리로 인해 DB 커넥션 사용량이 증가하고, API 호출 시간 지연으로 인해 DB 커넥션 점유 시간 증가

병렬 처리는 처리 속도를 높이는 데 효과적이지만, DB 리소스(DB Resource) 사용량 증가에 대한 고려가 필요하다.

배치 시스템 안정성 확보를 위한 핵심 요소

본문에서는 배치 시스템의 안정성을 확보하기 위한 핵심 요소들을 강조한다. 단순히 처리 속도를 높이는 것뿐만 아니라, DB 리소스(DB Resource) 관리API 호출 시간 최적화가 중요하다는 점을 강조한다.

DB 커넥션 관리: DB 커넥션 점유 시간을 최소화하여 Connection Pool 부담 완화

API 호출 최적화: API 응답 시간을 단축하거나, 비동기 처리(Asynchronous Processing)를 통해 DB 커넥션 점유 시간 감소

모니터링: DB 커넥션 사용량, API 응답 시간 등을 모니터링하여 문제 발생 시 신속하게 대응

결론적으로, 배치 시스템의 안정성은 DB 리소스(DB Resource) 관리, API 호출 최적화, 모니터링의 세 가지 요소가 균형을 이룰 때 확보될 수 있다.

“장보기 지원금이 곧 소멸돼요” 알림 뒤에서 일어난 일