오늘의 질문
캐시 스탬피드 현상에 대하여 설명해주세요.

📍 캐시 스탬피드 현상

대규모 트래픽 환경에서 캐시를 운용하는데, Cache Aside (캐시 미스 발생 시 적재) 전략을 사용한다고 가정한다. 이 때 수많은 요청이 동시에 캐시 미스를 확인하고 원본 데이터베이스에서 데이터를 가져와 캐시를 적재하는 상황이 발생할 수 있는데, 이를 캐시 스탬피드 현상 혹은 Thundering Herd 문제 라고 한다. 캐시 스탬피드 현상은 원본 데이터베이스와 캐시의 성능을 저하시킬 수 있다.


해결방법

이전에 캐싱 전략을 공부했을 때, cache warming (운영 초기에 대량의 캐시 미스가 발생할 것에 대비해 미리 데이터를 적재) 전략으로 해결할 수 있다는 글을 봤었다. 다만 이 경우는 운영 초기에 캐시 미스가 충분히 예상되는 상황일 때 선택할 수 있는 전략이고, 이번에는 대규모 트래픽이 발생했을 때 해결할 수 있는 방법을 알아보자.


잠금 (Locking) 방식

하나의 요청 스레드만 잡아 백엔드로 보내고, 나머지는 캐시에 데이터를 생성할 때 까지 대기한다.
잠금을 획득한 스레드는 사용자 요청에 응답하는 동안 캐시 적재 작업을 비동기로 수행한다.
  • 잠금을 사용하기 때문에 성능 저하 가능성이 있다.

  • 잠금을 획득한 스레드의 실패, 잠금의 생명주기, 데드락 등 다양한 상황을 고려해야 한다.


외부 재계산 (External Recomputation) 방식

모든 요청 스레드가 캐시 적재 작업을 수행하지 않는다.
다만, 캐시를 주기적으로 모니터링하는 스레드를 별도로 관리하여 캐시의 만료시간이 얼마 남지 않은 경우 데이터를 갱신하여 문제를 예방한다.
  • 다시 사용하지 않을 데이터를 포함하여 갱신하기 때문에 메모리에 대한 불필요한 연산이 발생한다.

  • 메모리 공간을 비효율적으로 사용할 가능성이 있다.


확률적 조기 재계산 (Probablistic Early Recomputaiton) 방식

캐시 만료 시간이 얼마 남지 않은 경우, 확률이라는 개념을 사용하여 요청 스레드 중에서 적은 수만이 캐시를 적재하도록 한다.


🔖 참고자료

매일메일

라인 기술 블로그