피드로 돌아가기
올리브영 테크블로그Backend
원문 읽기
고성능 캐시 아키텍처 설계 - 로컬 캐시와 Redis로 대규모 증정 행사 관리 최적화
올리브영이 ElastiCache와 Caffeine Cache를 조합한 다중 레이어 캐시 아키텍처로 Redis 송신 네트워크 트래픽 99.1% 감소 및 TPS 478% 증가 달성
AI 요약
Context
올리브영의 증정 행사 시스템에서 매일 수만 수십만 명의 사용자가 동시에 RDS의 행사 데이터를 조회하면서 디스크 기반 데이터베이스의 응답 속도 저하 문제가 발생했다. 메모리 기반 Redis(ElastiCache)를 도입했으나, 진행 중인 행사가 많아질수록 ElastiCache의 송신 네트워크 바이트 수치가 지속적으로 높아져 네트워크 대역폭 포화로 인한 장애 위험이 증가했다.
Technical Solution
- 글로벌 캐시 버전 관리 도입: ElastiCache에 행사 정보를 List 형태로 저장하되, 데이터 변경 시 증가하는 버전 번호(v1, v2, v3...)를 key에 포함시켜 항상 최신 데이터만 제공
- 다중 레이어 캐시 아키텍처 구성: 로컬 캐시(Caffeine Cache)를 애플리케이션 레벨에 추가하고, 먼저 로컬 캐시 조회 후 미스 시에만 ElastiCache 조회하도록 계층화
- 버전 기반 일관성 보장: 애플리케이션이 ElastiCache에서 최신 버전 정보를 먼저 조회한 후, 해당 버전을 key로 사용하여 로컬 캐시에 접근함으로써 분산 환경에서 데이터 일관성 유지
- Caffeine Cache 개별 설정: Enum 클래스로 캐시별 옵션(expireAfterWrite, maximumSize)을 별도 관리하여 캐시 타입마다 60초 TTL, 100개 최대 항목 제한 등을 설정
- @Cacheable 어노테이션 기반 구현: 조회 메서드에 @Cacheable 어노테이션을 적용하고 version을 key 파라미터로 사용하여 캐싱 로직 자동화
Impact
- TPS(초당 트랜잭션 수): 478% 증가
- Redis Network Bytes out: 99.1% 감소
Key Takeaway
분산 환경에서 로컬 캐시를 도입할 때는 글로벌 캐시의 버전 정보를 조회 키로 활용하면 데이터 일관성을 보장하면서도 네트워크 대역폭을 대폭 절감할 수 있다. ElastiCache와 같은 중앙 집중식 캐시만으로 해결 불가능한 대규모 트래픽 상황에서 다중 레이어 캐시 전략이 효과적이다.
실천 포인트
Redis를 중앙 캐시로 사용하는 대규모 시스템에서 네트워크 송신량이 병목이 될 때, 애플리케이션 인스턴스마다 Caffeine Cache 같은 로컬 인메모리 캐시를 추가하되 Redis의 버전 정보를 조회 키로 포함시키면 모든 인스턴스의 데이터 일관성을 유지하면서도 Redis 트래픽을 90% 이상 줄일 수 있다.