Ehcache에 대해 알아보자

Fermion·2024년 1월 12일
0

What is Development

목록 보기
5/9

Ehcache란?

Ehcache는 Spring에서 간단하게 사용할 수 있는 Java 기반의 오픈소스 라이브러리이다.
https://github.com/ehcache

Ehcache는 Spring 내부에서 동작하며 캐싱을 수행한다.

Spring AOP 기능을 활용하여 annotation을 이용해 간단하게 사용할 수 있다.


Ehcache2와 Ehcache3의 차이

Ehcache 2 버전과 Ehcache 3 버전의 차이는 다음과 같다.

  • javax.cache API(JSR-107)와의 호환성을 제공
    • JCache는 JSR-107에 의해 정의된 표준 Java Caching API
    • Caching Provider와 CacheManager 인터페이스를 구현하여 실행
  • Offheap Storage 사용 가능
    • OffHeap은 Heap Memory를 벗어난 메모리로 Java GC에 의해 데이터가 정리되지 않는 공간
  • 별도의 설치 없이 Spring Caching과 Hibernate Integration이 가능
    • javax.cache를 지원해주기 때문

Ehcache의 Cache Entry Expiration

Ehcache는 Cache Entry Expiration을 제공
설정해둔 일정한 크기의 시간이 지나면 cache entry를 cache에서 자동으로 제거해 줌

  • TTL(time-to-live): cache에 put된 후 몇초 후에 제거할지를 설정
  • TTI(time-to-idle): cache에서 retrieve된지 몇초가 지나면 제거할지를 설정

Ehcache의 Storage Tier

Ehcache에는 Storage Tier가 존재하며, 상위 단계일수록 빠름

  • On-Heap Store: Java의 on-heap RAM memory를 cache entry 저장에 사용하는 방식
    • Java application의 동일한 heap memory를 사용하여 JVM GC의 대상이 됨
  • Off-Heap Store: 사용가능한 RAM에 의해 크기가 제한되는 방식
    • Java GC의 대상이 되지않음
    • data가 저장되거나 접근할 때 JVM Heap으로 data가 이동해야 하므로 상대적으로 느림
  • Disk Store: Disk(File System)을 cache entry 저장에 사용하는 방식
    • RAM-based store보다는 느리지만 풍부한 공간을 제공
  • Clustered Store: Remote Server를 이용한 cache 저장 방식
    • 선택적으로 failover server(Active-Passive)를 가져 향상된 high availability를 제공 가능
    • network latency, client/server consistency 등의 이유로 local off-heap storage 보다 느림

Ehcache의 Topology Type

Ehcache에는 두 가지 Topology Type이 존재

  • Standalone: data set이 application node에 존재하는 방식

    • 각 application node가 독립적이고, 각 node 사이에 상호작용이 없는 방식
    • 여러 application node가 동일한 application을 실행중일 때 사용
  • Distributed/Clustered: data가 remote server에 존재하고, hot data가 각 application node에 존재하는 방식

    • consistency option을 제공
    • clustered나 scaled-out application 환경에서 권장
    • 한 application에서 cache된 data는 모든 cluster member가 사용 가능
    • cluster에 있는 모든 data가 사용 가능
    • 하나 이상의 mirror server가 HA를 제공하기 위해 배포됨

    Distributd Cache를 사용하지 않으면 다음과 같은 현상이 발생할 수 있음
    Cache Drift: 한 cache의 update가 다른 application에 적용되지 않는 현상
    Database Bottleneck: 분산 환경에서 각 application에 있는 여러 cache의 loading과 refreshing에서 발생하는 overhead가 database bottleneck을 유발


Ehcahe의 Terracotta Server

Distributed/Clustered Cache를 사용하기 위해 Terracotta Server를 사용함

Terracotta Server를 사용하기 위해서는 clustered cache storage에 설정한 terracotta server를 deploy해야 함
Ehcache 3.1부터 Terracotta Server와 client library를 downloadable kit로 제공하기 때문에
Cache Manager가 관리하는 cache가 clustered storage를 이용할 수 있도록 Cache Manager의 Clustering Capability를 설정하면 됨


Terracotta Clustering에서 사용되는 개념

  • Server off-heap resource: server에 정의된 storage resource
    • cache는 server off-heap resource 내에 그들의 cluster tier를 위해 storage area를 예약해둘 수 있음
  • Cluster Tier Manager: server-side component로 cache manager에 clustering capability를 제공
    • Cache Manager가 Cluster Tier Manager에 연결하여 server의 storage resource에 접근하도록 해서 그들의 clustered tier cache가 resource를 사용하게 함
    • unique identifier를 사용하여 여러 cache manager가 동일한 cluster tier manager에 접근하여 cache data를 공유하게 함
    • cluster tier cache의 storage를 관리하는 책임을 짐
  • Dedicated pool: cluster tier cache에 할당되는 고정 크기의 storage pool
    • server off-heap resource에서 dedicated pool로 직접적으로 storage가 할당됨
    • cluster tier에 의해 독점적으로 사용되는 공간
  • Shared pool: 여러 cache의 cluster tier에 의해 공유되는 고정 크기의 storage pool
    • dedicated pool과 같이 serer off-heap resource에서 직접적으로 storage가 할당됨
    • shared pool에서 사용가능한 storage는 cluster tier만 요청하여 공유할 수 있음
    • 이를 사용하는 각 cache의 data는 독립적이지만 storage는 공유하는 방식


Ehcache의 Cache Usage Pattern

Ehcache가 지원하는 접근 패턴은 다음과 같음

  • Cache-aside: Application code가 cache를 직접 사용하는 방식
    SoR에 접근하는 application code가 cache를 먼저 확인하여 존재하면 SoR을 우회하여 cache로부터 data를 직접 return하고, 존재하지 않으면 SoR에서 data를 가져와 cache에 저장하고 return함
    data가 write되면 cache는 SoR과 함께 update되어야 함
  • Cache-as-SoR: cache를 primary SoR인 것처럼 사용하는 방식
    SoR reading과 writing 작업을 cache에 위임하여 application code가 책임지지 않도록 함
    • Read-through: cache가 SoR로부터 data를 load하는 역할을 수행할 수 있는 loader component로 구성됨
      cache가 요청 받은 (key, value)가 cache에 존재하지 않으면 loader를 호출하여 SoR에서 value를 얻어 cache에 저장하고 돌려줌
    • Write-through: cache가 SoR에 data를 write하는 역할을 수행할 수 있는 writer component로 구성됨
      cache가 (key, value)를 저장하도록 요청받으면 cache를 update하고 writer를 호출하여 SoR에 value를 저장함
    • Write-behind: SoR에 write하는 시점을 변경하는 방식
      update를 하는 thread가 기다리는 동안에 SoR에 write하는 방법 대신, data가 나중에 write되도록 기다리게 함
      SoR이 update되기 전에 지연을 도입하여 그 비용을 통해 user thread가 더 빨리 움직이도록 함

SoR(System-of-Record)은 데이터를 신뢰할 수 있는 권위있는 소스
파일 시스템이나, long-term storage와 같은 전통적인 DB를 의미

해당 기능은 CacheLoaderWriter를 통해 사용 가능할 수 있음


출처

https://www.ehcache.org/

profile
Deep dive into development

0개의 댓글