Cache 전략

캐시를 잘 활용하여 리소스를 줄여보자

Featured image

Cache

image-center

데이터를 미리 저장해두고 필요할 때 빠르게 접근할 수 있는 메커니즘을 일컫는다. 자주 사용하는 동일한 데이터, 한 번 읽어온 데이터를 공유하고 지속적으로 사용하는 경우 등 캐시를 이용하면 보다 효과적이다. 외부 API 등 외부 서버 호출 시간을 줄여 응답 시간을 개선할 수 있다. 성능 향상, 부하 감소, 비용 절감 등의 효과를 기대할 수 있다.

스프링 서버와 데이터베이스 서버가 있다. 스프링 서버에서 데이터베이스에 바로 접근하여 읽기 및 쓰기 작업을 진행한다. 더 자주 접근하고 덜 자주 바뀌는 데이터들을 조회할 때를 상상해보자.

같은 데이터 조회를 위해 매번 데이터 베이스에 요청을 시도하는 것은 꽤 많은 리소스를 소비하는 것일 수 있다. 더 자주 접근하고 덜 자주 바뀌는 데이터들을 클라이언트가 요구할 때마다 꼭 데이터베이스를 들려야할까?

데이터베이스 외에 외부 API 호출도 똑같이 해당된다.

캐시 전략

image-center 데이터 베이스 및 외부 API 등 외부 서버와의 연동은 비용이다. 이 비용을 아끼기 위해 캐시를 사용하는 전략이 있다. 읽기/쓰기의 대표 전략들에 대해 알아본다.

읽기 전략

캐시를 활용한 다양한 전략들을 사용해 리소스를 개선할 수 있다. 읽기 작업 시 데이터 베이스를 바로 접근하지 않고 중간에 캐시를 두는 식으로 개선할 수 있다. 아래 설명하는 모든 읽기 전략들은 Cache 에 데이터가 있다면 리턴하는 대전제가 있다.

Cache-aside (Look-aside)

image-center

  1. ServerCache 에 저장된 데이터가 있는지 조회
  2. Cache 에 없으면 ServerDatabase에 접근
  3. Database 로부터 얻은 데이터를 Cache 에 저장

여기서 중요한 점은 애플리케이션 서버 가 직접 캐시를 관리한다는 것이다. 캐시 관련 코드가 서비스 로직에 추가되어 복잡도가 증가된다. 데이터를 읽어올 때 Cache 에 값이 없는 경우를 일컬어 캐시 미스 라 하는데 해당 전략은 캐시 미스시에 ‘캐시읽기 -> 디비읽기 -> 캐시쓰기’ 순서로 동작하기 때문에 성능이 느려질 수 있다.

Read-Through

image-center

  1. ServerCache 에 저장된 데이터가 있는지 조회
  2. Cache 에 없으면 CacheDatabase에 접근
  3. Database로부터 얻은 데이터를 Cache 에 저장

Cache 가 직접 Database 를 관리하는 방법이다. Cache-Aside 와는 다르게 Cache 서버가 직접 데이터 베이스를 관리하므로 서비스 로직에 관련 코드가 없다. 캐시 서버에 장애가 발생한 경우 SPOF 가 될 수 있다.

Cache-Warming

image-center 읽기 전략에서 서버는 항상 캐시에게 데이터가 있냐고 물어본다. 초기 조회 시 캐시는 데이터 베이스를 호출하게 되는데, 이런 경우 미리 캐시에 데이터를 넣어주는 작업을 Cache-Warming 이라고 한다. 초기에 급증하는 트래픽으로 인한 부하를 줄일 수 있다. 하지만 캐시의 용량은 매우 작기에 데이터를 잘 선별해야 하고 TTL 등을 활용할 수 있다.

쓰기 전략

읽기 전략과 마찬가지로 쓰기 전략도 있다. 데이터베이스에 직접 쓰기하는 것이 아니라 캐시를 활용해 성능에 대한 장점을 가져올 수 있다. 어떤 전략들이 쓰기 작업 시에 리소스를 줄일 수 있는지 알아본다.

Write Back

image-center

  1. Server 가 데이터 쓰기 작업을 실행한다.
  2. Cache 가 데이터를 모아두었다가 Database 에 반영한다. (스케쥴링 등)

Cache에 데이터를 모아둔 뒤 한 번에 Database 에 반영하기 때문에 쓰기 작업에 대한 부하를 줄일 수 있다. 데이터를 반영하기 전에 유실될 가능성이 있으므로 Redis 같은 경우 AOF, RDB 를 활용해 백업에 대한 정책을 세울 수 있다.

Write Through

image-center

  1. Server 가 데이터 쓰기 작업을 실행한다.
  2. Cache 에 데이터를 저장하고 Database 에 반영한다.

Cache 에게 쓰기 작업을 위임하며 CacheDatabase 에 동시에 반영하는 전략이다. 항상 최신 정보를 가지고 있지만 한 번의 쓰기 작업이 결국 2번의 쓰기 작업과 같으므로 상대적으로 느리다. 해당 데이터를 Cache 에 무조건적으로 저장하기 때문에 자주 사용하는 데이터인지 확인이 필요하다.

Write Around

image-center 데이터를 Database 에 저장하고 캐시 미스(읽기)가 발생한 경우에만 Cache 를 업데이트 시켜주는 전략이다. Read 시에 업데이트하기 때문에 상대적으로 빠르며 데이터 정합성에 주의해야 한다.

전체 결과의 80% 가 전체 원인의 20% 에서 일어나는 현상

파레토의 법칙은 이러한 캐시 전략의 효과를 설명해준다. 캐시 전략으로 빗대어 설명하자면 전체 데이터의 20%만 잘 캐시 해도 80% 의 비용 절감 효과를 기대할 수 있다.
image-center