2013년 10월 4일 금요일

새로운 영속 API(persistence API)


기존의 CacheLoader/CacheStore API는 인피니스팬 4.0 부터 있어왔다. 인피니스팬의 이번 릴리즈에서는 영속성과의 통합을 간결하게 하는 것과 상당한 성능 향상을 위한 문을 여는 두가지 면에서 큰 진전이 있었다.

무엇이 새로운가

새로운 영속성 통합이 가져온 것들을 보자.

  • JSR-107에 맞춤: 이제 JSR-107의 loaderwriter과 비슷한 CacheLoader와 CacheWriter 인터페이스를 가지게 되었고, 이는 JCache를 따르는 벤더 사이에서 포팅 가능한 스토어를 작성하는데 많은 도움이 될 것이다.
  • 간단해진 트랜잭션 통합: 모든 잠금은 이제 인피니스팬 레이어에서 처리된다. 그래서 구현체는 스토어에 대한 동시 접근을 조절하는 것을 고려할 필요가 없다. (기존의 LockSupportCacheStore는 이런 이유로 삭제되었다) 
  • 병렬 순회(parallel iteration):  이제 스토어 내의 엔트리를 여러 스레드가 병렬적으로 순회 가능하다. 맵리듀스 작업들은 클러스터내 노드와 동일 노드 안에서(복수개의 스레드로) 두 경우 다 병렬적으로 실행하므로 직접적인 이득을 보게 된다. 
  • 감소된 직렬화 (적은 CPU 사용): 새로운 API는 저장된 엔트리를 직렬화된 형식으로 노출하게 한다. 만약 한 엔트리가 단지 원격으로 보내지기위한 목적으로 영속적인 저장소로부터 불려진다면, 이제는 그것을 (스토어로부터 읽을 때) 역직렬화(deserialization) 하고 (원격으로 보낼때) 다시 직열화(serialization) 하지 않는다. 이제 스토어로부터 읽은 직열화된 형식을 직접 원격으로 쓴다.

API

이제 API를 좀 더 자세히 살펴보자.



위의 그림은 API의 주요 클래스들을 보여준다.

  • ByteBuffer - 객체위에 직렬화된 형식을 추상화 한다.
  • MarshalledEntry -  캐시에 추가된 하나의 키-밸류 쌍에 상응하여 영속 스토어에 저장된 정보를 추상화 한다. 직렬화된 ByteBuffer와 역직렬화된 객체에 포함된 정보를 읽기 위한 메소드를 제공한다. 보통 스토어로부터 읽혀진 데이터는 MarshalledEntry 구현체 안에서 직렬화된 형식으로 가지고 있다가 나중에 필요할 때 역직렬화 된다.
  • CacheWriterCacheLoader는 스토어에서 읽기와 쓰기에 관한 기본적인 메소드를 제공한다.
  • AdvancedCacheLoaderAdvancedCacheWriter는 병렬 순회(parallel iteration), 만료된 엔트리 삭제, 캐시 비우기 등 스토리지 안에서 대량으로 조작하기 위한 동작을 제공한다. 

제공자는 이런 인터페이스들중 어떤 것을 구현할 것인지 선택할 수도 있다.

  • AdvancedCacheWriter를 구현하지 않으면 해당 writer가 만료된 엔트리를 제거하거나, 캐시 비우기를 할 때 쓰이지 않는다.
  • AdvancedCacheLoader를 구현하지 않으면 해당 로더에 저장된 정보들이 프리로딩이나 맵리듀스 작업에 쓰이지 않게된다.

만약 현재 존재하는 스토어를 새로운 API로 이전하려한다면, SingleFileStore를 보는 것이 많은 도움이 될 것이다.

설정

마지막으로 스토어를 설정하는 방법이 바뀌었다.

  • v5.x의 loader 엘리먼트는 persistence로 대체되었다.
  • loader와 writer 둘 다 store 엘리먼트를 통해 설정된다. (v5.x에서는 loader와 store 엘리먼트가 있었다.)
  • preload와 shared 속성이 각 스토어에 설정되어 복수의 스토어 체인을 설정할 때 더 유연함을 준다.

미르차(Mircea)

원문:
Monday, 16 September 2013, New persistence API in Infinispan 6.0.0.Alpha4

댓글 없음:

댓글 쓰기