사내에서 래핑?한 라이브러리 중에 Async Cache와 관련된 내용들이 있는데 프로젝트에서 잘 다루고자 학습하게 되었다. 특히 그중에서도 Spring Caffeine Async Cache에 대한 내용을 다룬다.
Async Cache?
다양한 로컬 캐시가 있음에도 그 중에서도 비동기인 Spring Caffeine AsyncCache를 다루는 이유는 Spring Webflux 때문이다.
Spring Webflux 기반 프로젝트의 경우, 일반적인 동기 캐시를 사용하는 경우 블로킹으로 인한 문제가 발생할 수 있다.
따라서 Webflux 프로젝트에서 로컬 캐시를 사용하고자 할 때, Spring Caffeine Async Cache는 고려할 수 있는 좋은 Cache 라이브러리라고 생각된다.
비동기 캐싱을 지원하는 다른 옵션들로는
- Mono/Flux cache() : 스프링 캐시 설정으로 관리하던 캐시의 세부 설정을 적용하기 힘듦
- Reactor-addons CacheFlux/CacheMono : 지원 중단 https://github.com/reactor/reactor-addons/issues/237
- Completable Future을 통한 직접 구현
외 몇 가지 옵션들이 있다.
대표적인 스프링의 캐싱 라이브러리인 ehcache와 guava는 Thread-Safe하도록 ConcurrentHashMap/ConcurrentHashLinkedMap 등을 통해 사용할 수 있지만, 비동기 관련 API 기능을 제공하지는 않는다.
반면, Spring Caffeine AsyncCache는 CompletableFuture 기반 비동기 캐시 API를 지원하여, 복잡한 스레딩 코드 없이 비동기 캐시를 구현할 수 있다.
장점
- AsyncCache(AsyncLoadingCache) API는 CompletableFuture를 사용하므로, 별도의 스레드에서 실행되며 결과를 기다리지 않고 다른 작업들을 수행하여 Webflux의 동작에 블로킹을 발생시키지 않는다.
- 캐시된 데이터를 thread-safe하게 가져올 수 있으며, 캐시 미스 시에는 별도의 스레드에서 데이터를 로드하고 그 결과를 CompletableFuture로 반환하여 메인 스레드를 블로킹하지 않고 논블로킹 방식으로 동작할 수 있다.
- Spring Caffeine에서 제공하는 캐싱 관련 기능(TTL ,Refresh, MaximumSize 등)을 동일하게 적용할 수 있다.
- 추가적으로, 캐시 생성 시 Caffeine.executor(Executor)를 통해서 쓰레드 풀을 커스터마이징할 수 있다.
동작 순서
1. 클라이언트 요청 시, 이벤트 루프의 스레드 할당
2. 캐시 조회
- Cache Hit : 매핑 함수를 실행하지 않고, 캐시 값 반환
- Cache Miss : CompletableFuture를 통해 매핑 함수가 별도의 작업 스레드에서 데이터 로드 → 데이터 로드 후 캐시에 저장캐시 조회
3. CompletableFuture를 resolve하여 캐시 반환 (CompletableFuture)
마무리
Mono, Flux 기능을 직접적으로 제공하지는 않고 있다.
그러나, CompletableFuture / CompletableFuture<Map<K,V>> 타입을 Mono.fromFuture, Flux,fromIterable로 변환하여 사용할 수 있다.
Tomcat 서버의 경우 굳이 Async Cache가 꼭 필요한 경우가 많지는 않을 것 같다. 하지만, Spring Webflux의 경우 논블로킹이 성능에 큰 영향을 줄 수 있기 때문에, Spring Caffeine Async Cache는 고려해볼만한 좋은 옵션인 것 같다.
'백엔드' 카테고리의 다른 글
[Spring Boot] 단위 테스트, 통합 테스트 (0) | 2023.09.25 |
---|---|
gRPC통신에 관하여 (0) | 2023.08.07 |
Jackson 라이브러리를 활용한 (역)직렬화 다형성 - JsonTypeInfo / JsonSubTypes (0) | 2023.05.16 |
Kafka-(de)Serialize 에러, ErrorHandlingDeserializer (0) | 2023.03.29 |
Jar VS War (0) | 2022.11.15 |