라인에서 Cache를 사용할 때 발생하는 Thundering Herd 문제를 어떻게 해결했는지를 설명한 글입니다.


저도 이번에 이러한 현상을 Thundering Herd라고 부르는지 처음 알게 되었는데 보통 캐시를 쓰게 되면 디비에서 데이터를 가져와서 Redis 같은 캐시에 넣어두고 이후에는 캐시해서 조회해서 빠른 응답을 주게 됩니다. 하지만 캐시의 데이터를 계속 쓸수는 없고 캐시도 데이터가 많아지면 오래된 데이터는 사라지기 때문에 캐시에 데이터가 없거나 하면 디비에 가서 데이터를 가져와서 다시 캐시에 채워주게 됩니다.


이러한 경우 서버가 1대라면 문제가 안되지만 서버가 많고 당연히 사용자 요청도 동시에 많이 이뤄지기 때문에 캐시가 TTL로 없어지거나 하면 수많은 요청이 동시에 캐시에 데이터가 없어서 디비에 가서 디비에서 연결이 몰리고 이 데이터를 다시 캐시에 채워넣으려고 여러번 저장이 이뤄지게 되는데 이 문제를 Thundering Herd 문제라고 합니다.


이 문제를 Req-Saver라는 라이브러리를 만들어서 여러 요청이 들어왔을 때 하나의 요청만 디비에 갔다와서 데이터를 채워넣고 다른 요청은 캐시에 채워진 데이터로 응답하도록 지연시키는 구현을 했고 이를 스프링에 적용해서 성능 비교를 한 결과 평균 51%의 성능이 향상되었다고 합니다.


서비스에 따라 다르긴 하지만 부하가 심한 경우 캐시 만료에 따라 디비나 캐시에 부하가 몰릴 수 있는데 꽤 괜찮은 방법으로 보입니다.


https://techblog.lycorp.co.jp/ko/req-saver-for-thundering-herd-problem-in-cache

Req-Saver로 캐시의 골칫거리 'Thundering Herd 문제' 쉽게 풀기!

LY Corporation Tech Blog

Req-Saver로 캐시의 골칫거리 'Thundering Herd 문제' 쉽게 풀기!

다음 내용이 궁금하다면?

또는

이미 회원이신가요?

2024년 6월 19일 오후 6:12

 • 

저장 50조회 3,121

댓글 1