진승우 프로필 진승우 백엔드 개발자 이력서 PDF
Project

파일 스튜디오

파일 업로드부터 변환 처리, 상태 조회까지를 이벤트 기반 아키텍처로 설계한 서비스입니다.

파일 스튜디오 썸네일
기간 2026. 1 ~ 2026. 5 (4개월) | 인원 2명
핵심 구현
01이벤트 유실을 막기 위한 Outbox + CDC
02큐 깊이와 ALB 요청 수 기반 Auto Scaling
03Redis Pub/Sub으로 파일 변환 상태를 실시간 반영
04Presigned URL 기반 파일 업로드
05Redis DB 보정 전략으로 실시간성과 안정성 확보
사용 기술
Java Spring Boot RabbitMQ Debezium Redis MySQL AWS Docker
GitHub
TroubleShooting

트러블 슈팅

문제를 발견했을 때 증상만 막는 대신, 원인이 된 구조를 추적하고 운영 중 다시 터지지 않도록 설계까지 바꾼 사례를 담았습니다.

Redis 재기동 시 Thundering Herd → Hikari 풀 고갈

Redis 연결이 일시 단절되자 수백 개의 스레드가 동시에 DB로 몰리면서 Hikari 풀이 고갈되는 장애를 해결했습니다.

문제 요약

부하 테스트 도중 Redis를 재기동하는 과정에서 연결이 일시 단절됐고, SSE를 구독하던 수백 개의 스레드가 동시에 DB로 fallback하면서 Hikari 커넥션 풀이 순식간에 고갈됨. DB 조회까지 실패하면서 Redis도 DB도 응답하지 못하는 이중 불가 상태로 악화됨.

Before Redis 장애 시 모든 스레드가 동시에 DB fallback

동시성 제어 없음 → Thundering Herd 발생

Hikari 풀 10개 즉시 고갈 → DB 조회까지 실패

After DB 접근 제한 + 로컬 캐시 서빙

ReentrantLock.tryLock()으로 단 1개 스레드만 DB 조회

조회 결과를 Caffeine 로컬 캐시(TTL 60s)에 저장

나머지 스레드는 캐시 서빙, Redis 복구 후 TTL 만료 시 자동 복귀

핵심 정리

fallback 경로도 설계 대상이다. 아무런 제어 없이 열린 경로는 장애 상황에서 또 다른 장애의 시작점이 된다.

Debezium 크래쉬 루프 해결

Worker 오토스케일링 테스트 중 Debezium의 반복 재시작 문제를 발견했고, 이를 Worker에서 분리하는 구조 전환으로 해결했습니다.

벨로그 자세한 사항은 클릭
문제 요약

Worker ASG 스케일 아웃 시 신규 인스턴스의 Debezium이 AMI에 구워진 offsets.dat를 참조해 이미 삭제된 binlog 위치를 찾다가 크래시 루프 발생.
offsets.dat 삭제 시도 시 두 인스턴스가 동일한 server_id로 MySQL binlog에 동시 접속을 시도하는 핑퐁 크래시로 이어짐.

Before Debezium이 Worker EC2에 함께 배포

Worker 스케일 아웃 → Debezium 인스턴스도 함께 증가

AMI 생성 시점의 binlog 위치가 offsets.dat에 고정됨

RDS binlog 7일 보존 정책으로 인해 stale 참조 발생

After Debezium을 RMQ EC2로 분리

Worker 수와 무관하게 Debezium 단 1개 운영

스케일 아웃해도 CDC 충돌 없음

Worker EC2에는 Worker App만 배포

핵심 정리

CDC는 단일 인스턴스로 운영되어야 하는 컴포넌트. 스케일링 대상인 Worker에 함께 배포하는 것 자체가 잘못된 설계였으며, 역할에 맞는 서버로 분리하는 것이 근본 해결책이다.