
백엔드
Req-Saver로 캐시의 골칫거리 'Thundering Herd 문제' 쉽게 풀기!
두줄요약
캐시 미스와 만료 구간에서 발생하는 Thundering Herd 문제를 줄이기 위해 req-shield를 설계했습니다. 락과 TTL 갱신 전략으로 중복 조회를 억제하고 부하 테스트로 성능 향상을 확인했습니다.
문제 상황
- 캐시 미스 시 동일 요청이 백엔드 스토어로 몰리며 중복 조회와 중복 캐시 적재가 발생하는 Thundering Herd 문제
- 캐시 만료 시점에 트래픽이 겹치면 백엔드와 캐시 모두에 부하가 집중되는 구조
원인 분석
- 캐시 적중 여부와 무관하게 동일 키 요청이 각각 백엔드로 전달되는 점
- TTL 만료 구간에서 캐시 공백이 생기며 다수 요청이 동시에 재생성 작업에 진입하는 점
해결 방법
- 캐시 미스 시 로컬 락 또는 주입형 글로벌 락으로 대표 요청만 백엔드 조회와 캐시 적재 수행
- 캐시 히트 시 TTL이 일정 비율 이하로 남으면 비동기 갱신으로 만료 공백 최소화
- Spring AOP 기반 애너테이션과 코어 모듈로 MVC, WebFlux, Coroutine 환경에 맞게 통합
성능/운영 포인트
- Spring MVC, WebFlux, Kotlin Coroutine 환경에서 기존 방식 대비 평균 TPS 향상 확인
- Redis, 테스트 컨테이너, NGrinder를 활용한 부하 테스트로 효과 검증
- 대량 트래픽, 공통 데이터, 짧거나 중간 길이 TTL, 느린 백엔드 환경에서 활용 적합