본문 바로가기

테크톡 딥다이브

카카오 선물하기 팀의 캐싱 전략 (하이브리드 캐시와 캐시 웜업 자동화)

들어가기 앞서

이번 글은 카카오의 기술 세미나 영상을 보고 정리한 글입니다. 저 역시 영상을 보고 공부하는 주니어 개발자 이기 때문에 틀린 개념이 있을수 있습니다. 또한 영상에 없는 내용, 저의 주간적인 의견과 경험을 함께 정리할 예정이기에 틀린 내용이 있을수 있습니다. 혹시나 틀린 내용이 있다면 댓글에 알려주시면 감사하겠습니다~ :) 

 

대용량 트래픽 아니면 안 보셔도 됩니다! 선물하기 서비스 캐싱 전략 / if(kakaoAI)2024


1. 개선 배경 

 

카카오의 선물하기 서비스는 특정 이벤트나 프로모션을 진행하게 되면 대량의 트래픽이 발생하였습니다. 하지만 문제가 되던 이벤트의 트래픽은 평소 이벤트 트래픽 대비 3배, 평소 대비 13배 이상의 부하를 야기해, 예상치 보다 많은 트래픽으로 인해 데이터베이스 및 연관 서비스에 성능 저하 문제를 초래 하였습니다.

 

 

서비스 구조

카카오의 선물하기 서비스 구조는 평소 상품 데이터를 레디스 캐시에 저장해 사용하며, 캐시가 만료가 되었을 경우 외부 API 및 DB에서 데이터를 가져오며, 캐싱을 통해 응답 시간을 최적화하였습니다. 그리고 일반적으로 캐시에 있는 데이터의 최신성 오염 방지 및 갱신을 위해서 만료 시간(TTL)을 설정해 두었습니다. 

 

 

문제점

평소에는 전혀 문제가 없었지만, 평소대비 10배가 넘는 대용량 트래픽이 발생하는 상황에 외부 서버 및 DB에 트래픽이 흘러들어가며 캐시 스탬피드(Cache Stampede)문제가 발생하였습니다.

  • 캐시 스탬피드(Cache Stampede):
    • 캐시가 만료될 때 여러 클라이언트가 동시에 동일한 리소스에 접근함
    • 동일한 리소스를 동시에 여러번 캐싱될 수 있음
    • 서버 부하 증가 및 성능 저하를 초래할 수 있는 현상

 


2. 캐시 스탬피드 해결 전략

2.1 캐시 TTL(Time-to-Live) 증가

  • 설명:
    • 캐시 데이터의 유효 기간을 늘려, 캐시 만료로 인한 요청 폭증을 줄이는 방법.
  • 장점:
    • 캐시 히트를 높여 서버 부하를 감소.
  • 단점:
    • 데이터 최신성이 낮아져 사용자 경험 악화 가능.
    • 예: 이벤트 상품의 오픈 시점이 캐시에 반영되지 않는 문제.

 

Q. 글쓴이의 궁금점..

궁금증1. TTL이 늘리지 않는 상황에는 데이터 최신성이 유지 되는 것인가?

TTL을 늘리게 된다면 데이터 최신성이 낮아져 사용자 경험을 악화 한다고 하였는데, TTL을 늘리는 것과 데이터 최신성이 정말 연관이 있는 것일까? TTL을 늘린다고 데이터의 최신성이 잘못 된다면, TTL을 늘리지 않아도 데이터의 최신성이 잘못될 가능성이 있을것 같은데, 아마도 데이터의 최신성이 잘못될 빈도가 높아 진다의 의미로 사용한것 같다. 

 

궁금증2. 만약 데이터 최신성이 유지 되지 않는다면, TTL이 만료되기를 기다리는 것이 아닌 만료를 시켜야 하는거 아닐까?

영상에서 예시를 든것처럼 상품A가 품절되어 더이상 판매가 되면 안되는 상황이라면, TTL이 만료되기를 기다리는 것이아니라 캐시를 만료시키는 어떠한 행위를 해야 하는 것이 아닐까? TTL과 데이터의 최신성에는 연관이 없어 보인다.

 

(혹여나 카카오의 발표를 비난하거나 공격하는 것이 절대 아닙니다. 저는 이렇게 생각한다는 것을 공유하는 것이며, 발표라는 상황에서 간단하게 설명하기 위해 실제 경험과 다른 내용을 전달했을수도 있다고 생각하며, 혹시나 제가 궁금점을 제기한 것처럼 시스템이 구현되어 있더라도 제가 모르는 시스템이 더 있거나 히스토리가 있을거라고 생각하기에 절대 비난하거나 비판하는 내용이 압니다.)

 

2.2 분산 락 활용

  • 설명:
    • 캐시 만료 시 최초 요청만 갱신 로직을 수행하도록 분산 락을 적용.
  • 장점:
    • 데이터베이스 및 외부 서버의 부하 감소.
  • 단점:
    • 락 대기 시간으로 인해 응답지연 가능.
    • 선물하기처럼 빠른 응답이 중요한 서비스에는 부적합.

 

2.3 캐시 웜업(Cache Warm-Up)

  • 설명:
    • 별도의 배치를 활용해 캐시가 만료되기전 캐시를 미리 갱신하여 만료로 인한 부하를 방지.
  • 장점:
    • 항상 캐시를 조회하기 때문에 다른 서비스로의 트래픽 전파 방지.
  • 단점:
    • 캐시 대상 누락 시 Cache Stampede 문제가 반복될 가능성.

 

2.4 하이브리드 캐시 도입

  • 설명:
    • 로컬 캐시(Local Cache): 자주 변경되지 않고 개인화 데이터가 아니며 자주 조회되는 데이터를 저장.
    • 리모트 캐시(Remote Cache): 자주 변경되는 최신 데이터를 중앙에서 관리.
  • 장점:
    • 네트워크 비용 절감 및 응답 시간 단축.
    • 리모트 캐시, DB 서버, 연관된 외부 서비스 부하 완화.
  • 단점:
    • 데이터 일관성 문제 가능 (다중 서버 간 로컬 캐시 TTL 불일치!! > 로컬 캐시의 전형적인 문제!).
    • 해결 방법: 주키퍼(Zookeeper)를 활용한 변경 이벤트 동기화.

 


3. 하이브리드 캐시 (로컬 캐시 + 원격 캐시)

 

 

LNB(카테고리 바)와 네비게이션 바와 각은 영역의 데이터는 개인화 데이터가 아니며, 업데이트 빈도가 낮지만 홈 화면에 위치하기에 자주 조회되는 데이터 입니다. 이러한 영역의 데이터는 리모트 캐시에 저장하는 것보다 로컬 캐시에 저장한다면 네트워크 비용을 줄일수 있어 응답시간도 개선 할 수 있습니다. 

 

 

하이브리드 캐시는 쉽게 말해 로컬 캐시와 원격 캐시를 둘 다 사용한 구조를 말합니다. 저는 처음 하이브리드 캐시라는 용어를 보고 살짝 어려운 내용이 아닐까 겁을 먹었지만, 이해하고 보니 쉬운 내용이였습니다. 

 

로컬 캐시를 조회하여 데이터가 있다면 조회, 없다면 다시 원격 캐시를 조회합니다. 원격 캐시에 데이터가 있다면 조회 및 로컬 캐시에 데이터를 저장하고 없다면 외부 저장소(DB)를 조회 합니다.

 

 

3.1 로컬캐시의 가장 큰 약점 데이터 동기화

하이브리드 캐시를 사용하더라도 여전히 문제가 있습니다. 바로 로컬캐시에 저장된 데이터가 변경이 되었을때, 다른 서버에 저장된 로컬 캐시와 데이터가 동일하지 않다는 문제가 있습니다. 이러한 이슈는 하이브리드 캐시라서 발생하는 것이 아닌 로컬 캐시가 가지는 고유한 단점 입니다. 로컬 캐시는 에러를 추적하기도 쉽지 않기 때문에 데이터 동기화 이슈가 발생한다면 어디서 잘못된 것인지 추적하기도 쉽지 않습니다. 즉, 로컬캐시에 저장된 데이터를 변경하기 위해서는 만료 프로세스가 필요합니다.

 

 

3.2 LocalCache 업데이트를 위한 Zookeeper 활용

Zookeeper

  • 설명 :
    • 서버 간의 동기화를 위한 분산 코디네이션 기능
    • ZNode 기반 트리 구조로 데이터를 관리
    • 고가용성, 고서능
  • 장점 :
    • Watch 기능을 이용한 변경 이벤트 감지
    • 작고 가벼운 이벤트 처리에 사용
    • 기  존 인프라를 활용하여 운영 관리 비융 낮춤 (이미 인프라를 갖춘 경우)

카카오 선물하기 팀에서는 주키퍼를 활용하여 데이터 변경이 감지 되면 각 서버에 이벤트를 발행하여 캐시들을 만료 처리하도록 한다. 이때 당연하겠지만 원격 캐시와 데이터베이스의 데이터도 같이 업데이트 하거나 제거한다. 


4. 캐시 웜업 자동화

설명하기에 앞서 하이브리드 캐시와 캐시 웜업은 다른 발표자의 내용입니다. 또한 이번 캐시 웜업 자동화는 하이브리드 캐시를 사용하지 않고 일반 원격 캐시만 사용합니다. 

 

 

선물하기의 프로모션 페이지입니다. 프로모션 페이지는 관리자들이 실시간으로 변경이 가능하다는 특징이 있습니다. 특히 상품 리스팅은 상품명, 브랜드, 가격, 판매 상태 등으로 구성되며, 사용자에게 신뢰성 있는 데이터로 제공되어야 한다는 특징이 있습니다. 앞서 설명한 하이브리드 캐시에 저장되는 데이터와는 다른 영역의 데이터 입니다. 

 

또한 프로모션 페이지는 응답 데이터가 평균 1.5mb 정도로 큰 편이기 때문에 하이브리드 캐시를 사용할 경우에는 잦은 GC 혹은 각 인스턴스의 메모리 부하를 줄 수 있어 하이브리드 캐시는 사용하지 않고 리모트 캐시와 기본적인 캐시 웜업을 사용하고 있습니다. 그러나 사람이 직접 방식 등록하는 방식이다 보니 누락이 발생할 가능성이 있어 누락된 채 이벤트가 진행될 경우 캐시 스탬피드(Cache Stampede) 문제가 또다시 발생할 수 있어 프로모션 캐시가 스스로 갱신되는 자동화 방식에 대한 필요성을 느끼게 되었습니다.

 

 

PER (Probabilistic Early Recomputation) 알고리즘

  • 설명 :
    • Cache Stampede 문제 해결 방안
    • 캐시 만료전 일정 확률로 캐시를 새로 갱신하는 방법
  • 단점 :
    • 캐시가 만료되기 전 사용자 요청에 의존 (요청이 운이 좋지 않아 캐시 갱신 확률 범위를 벗어날 경우 갱신이 일어나지 않음)
    • 캐시 갱신 확률 범위를 높인다면 갱신 주기가 짧아지고 응답지연을 발생
    • 일정한 캐시 갱신 시간을 기대하기 힘듬

 

이후의 내용은 카카오 선물하기 페이지의 도메인 특성에 맞추어 PER 알고리즘을 커스텀한 경험에 대해 발표합니다. 처음에는 끝까지 정리하려고 하였으나, 아무래도 카카오 선물하기 페이지의 도메인에 맞춘 구현이다 보니 오랜 시간 거쳐 글로 정리하기에는 부담이 느껴졌습니다. 이후 내용을 이해하고 싶은 분들은 카카오 유튜브 영상을 시청해 주시면 감사하겠습니다. 또한 PER 알고리즘에 대해 조금 더 궁금하신 분들은 아래 참고 링크를 추가적으로 확인해 주시면 좋을것 같습니다.

 

참고 : 

https://meetup.nhncloud.com/posts/251

https://blog.hwahae.co.kr/all/tech/14003

https://velog.io/@sung_c