피드로 돌아가기
Dev.toBackend
원문 읽기
Singleflight 도입으로 DB CPU 100% 부하를 쿼리 1건으로 방어
Cache Stampede in Go: Preventing Thundering Herds with Singleflight, Stale Caching, and Request Coalescing
AI 요약
Context
캐시 만료 시점에 수만 개의 동일 요청이 동시에 DB로 집중되는 Cache Stampede 현상 발생. 단순 캐싱 구조로는 트래픽 피크 시 DB CPU 급증 및 응답 지연으로 인한 시스템 전체 붕괴 위험 존재.
Technical Solution
- Request Coalescing 패턴 적용을 통한 중복 실행 제거
- golang.org/x/sync/singleflight 패키지를 활용해 동일 키에 대한 동시 요청을 단일 실행으로 통합
- 첫 번째 요청자만 DB 쿼리를 수행하고 대기 중인 나머지 요청자에게는 동일한 결과값을 공유하는 구조 설계
- Service 구조체 내에 singleflight.Group을 유지하여 요청 생명주기를 넘어선 상태 공유 보장
- Stale-While-Revalidate 및 TTL Jitter 전략을 병행하여 동기적 캐시 재구축 부하 분산
- Shared Request Ratio 지표 모니터링을 통한 Stampede 방어 효율성 검증
실천 포인트
- singleflight.Group 인스턴스를 요청 핸들러 내부가 아닌 서비스 수준의 싱글톤으로 관리하는지 확인 - Cache Hit Ratio 외에 Shared Request Ratio와 DB Fallback Rate 지표를 대시보드에 추가 - 캐시 만료 시점의 트래픽 집중을 막기 위해 TTL에 랜덤 지터(Jitter) 적용 검토 - 프로세스 로컬 기반의 singleflight 특성을 고려하여 분산 환경에서의 조정 필요성 분석