Backend/SpringBoot 이론 부분

Cache Stampede

Dean83 2026. 1. 6. 10:48

캐시가 만료된 시점에 다수의 요청이 발생했을 경우, 캐시가 미스되어 DB 접근으로 접속이 몰리는 현상을 말한다. 대형 서비스는 순간적으로 몰리는 트래픽도 많기 때문에 이 경우 DB 장애 및 전체 서비스 마비가 올 수도 있다. 그게 아니더라도 응답속도 지연 등 문제가 발생한다.

특히 DB에 부하를 많이 발생하는 작업이나, CPU 사용량이 많은 서비스일 경우 그 데미지는 더 크다.  

 

이를 해결하기 위해서 여러 해결법이 있다. 

 

1. sync 옵션

동일 요청에 대해 한 요청만 DB 에 요청하고, 나머지 요청은 대기한다. 

이후, 한 요청이 완료되어 cache 에 갱신하게 되면 나머지 요청은 갱신된 캐시를 통해 결과를 리턴 받는다.

Cacheable 에서 sync = true 설정을 한다.

 

2. Cache warming

자주 참조될만한, 혹은 최근에 참조한 캐시 데이터 들을 만료되기전에 미리미리 갱신해 두는것을 말한다. 

어플리케이션 시작시(재시작 포함), 혹은 스케줄러로 주기적으로 동작 시킨다. 이는 개발자가 적절히 구현을 해주어야 한다.

 

3. 만료일 조정

1개의 요청이 요청 처리 과정중에 다수의 캐시를 생성 할 수도 있다. 이 때 생성한 캐시는 모두 같은 만료일을 갖게 되므로 만료기간이 되었을때 다수의 요청이 몰릴 수 있다. 이를 방지하기 위해서 랜덤값을 통해 해당 캐시들의 만료 시간을 약간씩 다르게 두는 것을 말한다.

 

 

 

카카오톡 선물하기의 경우, 캐시 데이터 중에서도 가중치 계산을 하여, 가중치가 높은 캐시 데이터 들을 리모트 캐시에서 로컬캐시에 두고, 이를 스케줄러를 이용해 1초 간격으로 실행하여 하이브리드 캐싱을 한다고 한다.