캐싱 (로컬캐싱, 글로벌 캐싱 trade-off)
2024. 3. 7. 17:58ㆍProject
Cache
- 캐시는 나중에 요청할 결과를 미리 저장해 둔 후 빠르게 서비스해주는 것을 의미한다.
- 즉, 결과를 미리 저장하고 나중에 요청이 오면, 이 요청에 대해서 DB를 참조하지 않고 캐시에 접근하여 요청을 처리하는 기법이다.
그렇다면 어떤 데이터를 캐싱해야할까?
- 자주 조회되면서 쓰기가 거의 일어나지 않는 데이터에 대해서 캐싱해야한다.
캐싱을 할때 로컬캐싱 vs 글로벌 캐싱
- 캐싱할 데이터를 선정했다면, 이 데이터를 "어디"에 저장할지 고민해야한다. 일반적으로 로컬메모리에 저장하거나, Redis와 같은 별도 서버에 저장할 수 있다.
- 로컬캐싱
- 애플리케이션 서버의 메모리에 캐싱할 데이터를 저장하는 방법이며 일반적으로 Guava cache나 Caffeine cache를 많이 사용한다.
- 장점
- 애플리케이션 로직을 수행하다 바로 같은 서버 내의 메모리에서 캐시를 조회하므로 속도가 빠르다.
- 단점
- 인스턴스가 여러개일 경우 문제점이 발생한다.
- 한 인스턴스에서 변경한 캐시를 다른 인스턴스에 전파할 수 없다. 단, 변경을 다른 인스턴스에 전파하는 로컬 캐싱 라이브러리도 있다.
- 각 인스턴스마다 캐시가 저장되므로 새로운 인스턴스가 뜨면 캐시를 새로 넣어야한다. 이로 인해 캐시 미스가 발생하여 트래픽을 견디지 못해 인스턴스가 죽을 수 있다.
- Cache miss : cpu가 원하는 데이터가 캐시에 없는 상태
- 인스턴스가 여러개일 경우 문제점이 발생한다.
- 장점
- 애플리케이션 서버의 메모리에 캐싱할 데이터를 저장하는 방법이며 일반적으로 Guava cache나 Caffeine cache를 많이 사용한다.
- 글로벌캐싱
- 글로벌 캐싱은 Redis와 같은 별도 서버에 캐시 데이터를 저장해두는 것이다.
- 장점
- 인스턴스간 캐시를 공유하므로 한 인스턴스에서 캐시를 수정하더라도 모든 인스턴스가 동일한 캐시 값을 얻을 수 있다. 새로운 인스턴스가 뜨더라도 이미 있는 캐시 저장소를 바라보면 되므로, 캐시를 채워 넣는 동작을 할 필요가 없다.
- 단점
- 네트워크 트래픽을 거쳐야 하므로 속도가 로컬 캐싱에 비해 느리다.
- 별도의 캐시 서버를 두어야 하므로 인프라 관리 비용이 생긴다.
- 인프라 관리 비용? → 서버 요금, 인프라 세팅 및 유지 보수하는 데 걸리는 시간, 장애 대응 대책 구상 등
- 별도의 캐시 서버를 두어야 하므로 인프라 관리 비용이 생긴다.
- 네트워크 트래픽을 거쳐야 하므로 속도가 로컬 캐싱에 비해 느리다.
- 장점
- 글로벌 캐싱은 Redis와 같은 별도 서버에 캐시 데이터를 저장해두는 것이다.
내가 선택한 방식
- '견종 검색 API'은 쓰기가 거의 일어나지 않고 조회만 일어나기때문에 캐싱에 적합하였다.
- 로컬캐싱을 선택하였는데 그 이유는 조회속도가 글로벌 캐싱보다 빠르기 때문이다.
- 또, '견종 검색 API'에서 '견종'자체가 344개로 매우 적은 데이터이기 때문에 이를 위한 새로운 캐시를 위해 별도로 Redis를 두는 것은 인프라 비용적인 측면에서 적절하지 못하다고 판단하였다.
- 참조블로그
'Project' 카테고리의 다른 글
Offset기반의 페이지네이션 성능 개선(feat. Cursor Pagination, Covering Index) (0) | 2024.03.07 |
---|---|
타임라인 구현 방법 2가지 (pull mode, push model) (0) | 2024.02.23 |
오프셋 기반 페이지네이션 vs 커서기반 페이지네이션 (0) | 2024.02.22 |
Refresh Token을 redis에 저장한 이유? (0) | 2024.01.26 |
QueryDSL을 도입한 이유 (0) | 2024.01.25 |