[REDIS] Thundering Herd Problem

박상준·2024년 3월 22일
1

REDIS

목록 보기
12/20

개요

  • 정의
    • 병렬 요청이 공유 자원에 접근하는 경우 급격한 과부하를 발생시키는 문제
  • 언제 발생하나
    • 대규모 트래픽을 다루는 서비스에서 주로 발생한다.
    • 초당 REQUEST 가 많을 때 더욱 캐시를 세밀히 조정해야한다.

문제 상황

  1. 상황

    1. 연산에 1초가 걸리는 통계 데이터가 있고, 이를 REDIS 에 미리 캐싱해두었다고 가정
  2. 문제의 발생

    1. 0 시 0분 0 초에 약 만 개의 요청이 들어온 경우, 통계 캐시가 만료되어 캐시 미스가 발생
    2. 캐시 어사이드 패턴이 구현되어 있으면, 동시에 수많은 요청이 DB에 쿼리를 발생시킨다.

    캐시 어사이드 패턴( Cache aside pattern )

    • 지연 로딩 패턴이라고도 부른다.
    • 캐싱 전략 중 하나로서, 애플리케이션 코드가 명시적으로 캐시를 관리하는 방식이다.
    • 캐시에 데이터가 존재하지 않는 경우 (캐시미스) → 어플리케이션은 DB에서 데이터를 검색 → 결과를 캐시에 저장한 후 필요한 작업을 수행
  3. 결과

    1. 1초가 걸리는 통계 작업이 만 번 발생하며, 어플리케이션 서버에 엄청난 처리량을 요구된다.

해결 방안

  • 주기적인 캐시 최신화
    • 별도의 프로세스에서 크론잡을 통하여 캐시를 주기적으로 최신화 시켜주어야 한다.
  • 캐싱 관리
    • 대규모 트래픽을 처리하는 서비스에서 캐싱을 적용하는 것도 중요하지만, 캐시를 어떤식으로 관리하는지도 유의해야한다.

추가 방안

  • 캐시 락
    • 캐시 미스가 발생한 경우, 단일 요청만 DB에 접근하도록 하고, 나머지 요청은 결과를 기다리게 하는 방법임
  • 캐시 스탬프
    • 캐시 만료 시간을 약간 랜덤하게 조정하여, 동시에 만료되는 상황을 방지하는 방법
  • 백그라운드 업데이트
    • 캐시가 만료되기 전에 백그라운드 작업을 통해 캐시를 미리 업데이트 하는 방법
profile
이전 블로그 : https://oth3410.tistory.com/

0개의 댓글