서비스 시작 직후 또는 특정 캐시 키 만료 시점에 다수의 요청이 동시에 캐시 미스(cache miss)를 발생시켜 백엔드 시스템에 과부하를 주는 Cache Stampede(또는 Thundering Herd) 문제를 해결하기 위한 고급 전략들을 설명해 주세요.
힌트 · 뮤텍스 락(single flight), 확률적 캐시 만료(probabilistic early expiration), 비동기 캐시 갱신, 백오프(backoff) 전략 등을 고려하세요.
모범답안
Cache Stampede는 캐시 미스 발생 시 다수의 요청이 동시에 백엔드 시스템에 몰려 과부하를 주는 문제입니다. 해결 전략으로는 다음과 같은 것들이 있습니다.
첫째, **Mutex Lock (Single Flight)**을 사용하여 첫 번째 요청만 백엔드에서 데이터를 가져오고, 나머지 요청은 첫 번째 요청이 완료될 때까지 기다리도록 합니다.
둘째, **확률적 만료 (Probabilistic Early Expiration)**를 적용하여 캐시 만료 시간을 약간씩 랜덤하게 조정합니다. 이를 통해 동시에 만료되는 키의 수를 줄일 수 있습니다. 예를 들어, cache.set(key, value, expire_time + random(jitter)) 와 같이 구현할 수 있습니다.
셋째, **비동기 캐시 갱신 (Background Refresh)**을 활용하여 캐시가 만료되기 전에 백그라운드에서 데이터를 갱신합니다.
넷째, 백엔드 시스템에 과부하가 걸리는 상황을 감지하고, 요청 재시도 시 백오프 (Backoff) 전략을 적용하여 재시도 간격을 점진적으로 늘려 시스템 부하를 줄일 수 있습니다.
이러한 전략들을 조합하여 상황에 맞게 적용하면 Cache Stampede 문제를 효과적으로 해결할 수 있습니다.
읽었다면, 이제 직접 답해볼 차례예요
패스잇 앱에서 이 질문에 말로 답하면 AI가 꼬리질문까지 이어가며 1:1 코칭합니다.
함께 보는 캐시 (Redis) 면접 질문
- 대규모 트래픽을 처리하는 서비스에서 Redis Cluster를 구축한다고 가정할 때, 데이터 샤딩 전략(예: 해시 태그) 선택 기준과 특정 키가 특정 슬롯에 할당되도록 제어하는 방법, 그리고 클러스터 재편성(resharding) 시 발생할 수 있는 성능 저하를 최소화하는 방안에 대해 설명해 주세요.
- Redis의 maxmemory-policy 설정이 서비스의 데이터 접근 패턴 및 메모리 사용량에 미치는 영향을 심층적으로 분석하고, 특정 워크로드(예: 실시간 랭킹, 세션 관리)에 최적화된 정책을 선택하기 위한 기준과 추가적인 성능 튜닝 방안(예: maxmemory-samples, 데이터 구조 선택)을 설명해 주세요.
- Redis 캐시 업데이트 시 발생하는 경쟁 조건(Race Condition) 문제를 방지하기 위해 어떤 방법들을 사용할 수 있으며, 특히 복잡한 로직을 원자적으로 실행해야 할 경우 Redis의 Lua 스크립트를 어떻게 활용할 수 있는지 구체적인 예시와 함께 설명해 주세요.
- Redis의 RDB와 AOF 지속성(persistence) 메커니즘의 장단점을 비교하고, 데이터 손실을 최소화하면서 고가용성(High Availability) 및 재해 복구(Disaster Recovery)를 보장하기 위한 아키텍처 설계 방안(예: Redis Sentinel, Redis Cluster와 연동)을 설명해 주세요.
- Redis에서 특정 키(Hot Key)에 대한 접근이 집중되거나, 매우 큰 키(Big Key)가 존재할 때 발생할 수 있는 성능 문제(예: 네트워크 대역폭 소모, CPU 부하)를 설명하고, 이를 진단하고 완화하기 위한 구체적인 방법들을 제시해 주세요.