DoorDash의 Entity Cache: 서비스 메시 내 투명 프록시 캐싱 아키텍처
DoorDash는 수백 개의 마이크로서비스가 복잡하게 연결된 환경에서 서비스 간 중복 호출로 인한 레이턴시 증가와 불필요한 부하를 해결하기 위해 Entity Cache라는 투명 프록시 캐싱 플랫폼을 자체 개발했다. 이 플랫폼은 기존 서비스 메시 인프라 위에 자연스럽게 녹아들어 동작하며, 초당 150만 RPS를 처리하면서 99.99999%의 가용성을 달성했다. 단순한 캐시 레이어가 아니라, 대규모 분산 시스템에서 운영 가능한 수준의 신뢰성과 성능을 동시에 확보했다는 점에서 주목할 만하다.
Envoy + Valkey 기반의 투명 캐싱 설계
Entity Cache의 핵심은 Envoy 프록시와 Valkey(Redis 호환 오픈소스 캐시) 의 결합이다. Envoy는 DoorDash의 서비스 메시 내에서 사이드카 프록시로 동작하고 있었기 때문에, 별도의 클라이언트 코드 수정 없이 투명하게(transparently) 캐싱 레이어를 삽입할 수 있었다. 즉, 호출하는 서비스 입장에서는 여전히 동일한 엔드포인트를 호출하지만, 실제로는 Envoy가 중간에서 캐시 히트 여부를 판단해 응답을 돌려주는 구조다.
이 투명성은 실무적으로 매우 중요하다. 수백 개의 서비스 팀이 각자 캐시 로직을 도입하거나 클라이언트를 변경할 필요 없이, 인프라 레벨에서 일괄 적용이 가능하기 때문이다. 또한 Valkey를 캐시 스토리지로 선택함으로써 Redis와의 호환성을 유지하면서도 오픈소스 생태계의 유연성을 확보했다.
[Service A] → Envoy Sidecar → (Cache Hit?)
├── Yes → Valkey에서 응답 반환
└── No → [Service B] 호출 후 Valkey에 캐시 저장
이벤트 기반 무효화와 장애 처리 전략
캐시에서 가장 어려운 문제 중 하나는 데이터 일관성 유지다. DoorDash는 TTL 기반의 단순 만료 방식이 아니라, 이벤트 기반 캐시 무효화(event-driven invalidation) 를 채택했다. 데이터가 변경되면 관련 이벤트가 발행되고, 이를 감지해 해당 캐시 엔트리를 즉시 무효화하는 방식이다. 이를 통해 불필요하게 긴 TTL로 인한 stale 데이터 문제와, 너무 짧은 TTL로 인한 캐시 효율 저하 사이의 균형을 맞출 수 있었다.
장애 처리 측면에서도 세심한 설계가 반영되어 있다. Valkey 클러스터에 장애가 발생하더라도 Envoy가 캐시 미스로 처리하고 원본 서비스로 폴백하는 구조를 취해, 캐시 장애가 서비스 전체 장애로 전파되지 않도록 설계했다. 이는 분산 시스템에서 캐시를 "있으면 좋은 것(nice-to-have)"이 아닌 "안정적으로 없어도 되는 것(safe to fail)"으로 다루는 올바른 접근이다.
성능 최적화와 실무 적용 시사점
150만 RPS라는 규모에서 안정적으로 동작하기 위해 DoorDash는 여러 성능 최적화를 적용했다. 직렬화/역직렬화 오버헤드를 최소화하기 위한 페이로드 설계, 캐시 키 충돌 방지를 위한 네임스페이스 전략, 그리고 Envoy 필터 체인의 효율적인 구성이 대표적이다. 이 과정에서 단순히 캐시를 붙이는 것이 아니라, 캐시가 시스템의 병목이 되지 않도록 설계하는 것이 핵심이었다.
Java 기반 백엔드 시스템에서도 이 아키텍처에서 배울 점이 있다. 서비스 메시(Istio, Envoy 등)를 이미 사용하는 환경이라면, 애플리케이션 코드 변경 없이 프록시 레벨에서 캐싱을 적용하는 방식이 팀 간 조율 비용을 크게 줄일 수 있다. 또한 Redis나 Valkey와 같은 인메모리 스토어를 활용할 때, 단순 TTL 설계보다 이벤트 기반 무효화와 폴백 전략을 함께 설계하는 습관이 운영 안정성을 높이는 데 직결된다.
정리
- 투명 프록시 캐싱: Envoy 사이드카를 활용해 클라이언트 코드 변경 없이 서비스 메시 레벨에서 캐싱을 적용하여 적용 범위와 일관성을 확보했다.
- 이벤트 기반 무효화: TTL에만 의존하지 않고 데이터 변경 이벤트로 캐시를 즉시 무효화함으로써 데이터 일관성과 캐시 효율을 동시에 달성했다.
- 장애 격리 설계: 캐시 장애 시 원본 서비스로 자동 폴백하는 구조로, 99.99999% 가용성이라는 높은 신뢰성 목표를 실현했다.