2009-06-11 5 views
26

여러 JVM간에 캐시를 공유 할 수있는 Java 프레임 워크를 찾고 있습니다.클러스터 공유 캐시

내가 원하는 것은 과 같은 것이지만 "배포 된"부분은 없습니다. 캐시에 항목을 추가하고 다른 "그룹 구성원"캐시에 자동으로 동기화되도록 할 수 있어야합니다. 가능한 경우 신뢰할 수있는 멀티 캐스트를 통해 캐시를 동기화하고 싶습니다.

저는 Shoal을 보았습니다.하지만 슬프게도 "분산 형 상태 캐시"는 내 요구 사항이 불충분 한 구현처럼 보입니다.

나는 JBoss Cache을 보았지만, 내가해야 할 일이 조금 과장된 것 같습니다.

내가 뭘해야하는지 가장 유망한 도구 인 것 같습니다. JGroups을 보았습니다. JGroups에 경험이있는 사람이 있습니까? 공유 캐시로 사용 되었다면 바람직합니까?

다른 제안 사항이 있으십니까?

감사합니다.

EDIT : 우리는 Hazelcast와 Infinispan 사이를 결정하는 데 도움이되는 테스트를 시작합니다. 곧 답을 알려 드리겠습니다.

EDIT : 갑자기 요구 사항이 변경되어 더 이상 분산 된지도가 필요하지 않습니다. 우리는 낮은 레벨 시그널링 프레임 워크를 위해 JGroups를 사용할 것이다. 도움을 주신 모든 분들께 감사드립니다.

+1

Hazelcast 및 Infinispan? 흠. 이러한 기술은 성숙한 기술은 아닙니다 ... 하나의 노드에서 Hazelcast 데모에서 Ctrl-z를 눌러보십시오. 두뇌를 분할하십시오. Infinispan은 여전히 ​​알파에 있습니다! http://java-source.net/open-source/cache-solutions에서 출발점을 찾아 볼 것을 권한다. EHCache, OSCache 및 JBoss Cache는 적어도 성숙 된 잘 받아 들여진 기술입니다. 당신은 이미 테라코타가 헤비급이기 때문에 괜찮다고 말씀하셨습니다. 나는 당신이 당신의 시간을 낭비하고, 당신이 완전히 불안정한 무엇인가 갔다고 생각하는 것을 싫어합니다. –

+0

우리는 아직 결정하지 않았습니다, 우리는 단지 테스트하고 있습니다. 귀하의 우려에 고마움 테일러 :) 또한 Hazelcast 데모의 CTRL-Z도 잘 작동합니다. 따라서 작업 관리자 나 다른 방법으로 노드를 죽이는 경우도 있습니다. – GuiSim

+0

다시 한번 테라코타가 당신을 도울 수 있습니다 ;-). 테라코타의 잠금/신호 전송은 매우 쉽습니다. 다음은 클러스터의 스레드 간 신호 전달을 위해 클러스터에서 대기/통보합니다. http://www.terracotta.org/web/display/orgsite/Recipe?recipe=waitnotify –

답변

8

더 많은 검색을 한 후에, 나는 JGroup's ReplicatedHashMap을 찾았습니다. 철저한 테스트는 아니지만 훌륭한 시작처럼 보입니다. 그것은 내가 필요로하지 않는 너무 많은 기능을 제공하지 않고 나의 모든 요구 사항을 채 웁니다. 또한 매우 유연합니다.난 아직도 "완벽한"대답을 찾고 있어요 :)

답해 주셔서 감사합니다.

+2

JBossCache는 본질적으로 ReplicatedHashMap의 강력한 기능 구현입니다. 동일한 JGroups 전송 메커니즘을 사용합니다. – skaffman

1

Memcached에는 여러 개의 Java Clients이 있습니다.

+0

웹 서버에서 작업하지 않습니다. 여기에있는 문제는 "캐시"라는 용어인데 실제로는 내가 찾고있는 것이 아닙니다. 공유 데이터 구조가 필요합니다.) – GuiSim

+0

Memcached는 웹 서버와 관련이 없습니다. 그것은 당신이 찾고있는 유형입니다. –

5

테라코타를 고려하셨습니까? 과용 될 수 있습니다 : http://www.terracotta.org/web/display/orgsite/Data+Caching

얼마 전까지 캐싱 영역에 JSR이 있었는데 다음 중 하나에 해당합니까? http://java-source.net/open-source/cache-solutions/jcache?

저는 개인적으로 FKache를 몇 년 전에 사용해 왔지만 제대로 작동했지만 배포 모드에서는 사용하지 않았습니다.

데이터의 로컬 복사본이있는 분산 캐시가 중요합니까? 만약 당신이 필요로하는 공유 메모리라면 JavaSpaces가 있습니다 ...

+0

나는 테라코타를 사용하는 것을 고려했고 당신이 말한 것처럼 잔인 함으로 그것을 최후의 수단으로 사용할 계획입니다. – GuiSim

+1

나는이 정서를 여기에서 이해하고 있는지 확신 할 수 없다. 저는 물론 테라코타 (Terracotta)에서 일하기 때문에 편향되어 있습니다 -하지만 테라코타를 사용하여 간단한 캐싱을 수행하는 것은 사실 매우 쉽고 탁월한 성능을 제공해야합니다. ConcurrentHashMap을 클러스터로 표시하는 것만 큼 간단하며 동기화 된 캐시가 있습니다. 예를 보려면 다음을 참조하십시오. http://www.terracotta.org/web/display/orgsite/Recipe?recipe=concurrenthashmap 그리고 퇴출을 원한다면 추가 기능 라이브러리에서 가져올 수 있습니다. http : //www.terracotta.org/web/display/docs/Cache+Evictor –

+0

테라코타에 대한 나의 유일한 작은 문제는 서버가 작동해야한다는 것입니다. 그것은 100 % P2P가 아닙니다. 나는 내 질문에 대답을 +1하지 않았 음을 알고있다. :) – GuiSim

0

내 옵션은 아파치에서 Java Caching System입니다. 제 생각에는 당신이 필요로하는 기능인 TCP Lateral Cache가 지원됩니다.

+0

제안에 감사하지만 문서에서 : "[...] 두 로컬 캐시는 잠재적으로 동일한 항목의 버전이 다를 수 있습니다. 대부분의 캐시와 마찬가지로 높은 사용률과 낮은 사용률을 위해 고안된 것이며이 사용은 부적절한 사용법을 암시합니다. "다시 한번"캐시 "라는 용어가 내 상황에서 사용할 올바른 단어가 아닌 것으로 의심됩니다. 나는 그것을 읽을 필요가있을 때마다 "캐시"에 데이터를 넣어야 할 것이다. – GuiSim

13

어때요?

로컬 ConcurrentHashMap을 로컬 캐시로 사용하십시오. Hazelcast 분산 맵/캐시를 생성하십시오. 분산 맵 이벤트 수신을 시작하고 로컬 ConcurrentHashMap을 갱신하십시오.

이제 각 구성원의 로컬 캐시는 동일합니다. 자동 동기화 됨.

import com.hazelcast.core.IMap; 
import com.hazelcast.core.Hazelcast; 
import com.hazelcast.core.EntryListener; 
import com.hazelcast.core.EntryEvent; 
import java.util.concurrent.ConcurrentHashMap; 

public class Sample implements EntryListener { 
     Map localCache = new ConcurrentHashMap(); 

     public static void main(String[] args) { 
       Sample sample = new Sample(); 
       IMap map = Hazelcast.getMap("default"); 

       //Listen for all added/updated/removed entries 
       map.addEntryListener(sample, true); 
     } 

     public void entryAdded(EntryEvent event) { 
      localCache.put(event.getKey(), event.getValue());    
     } 

     public void entryRemoved(EntryEvent event) { 
      localCache.remove(event.getKey());    
     } 

     public void entryUpdated(EntryEvent event) { 
      localCache.put(event.getKey(), event.getValue());    
     } 
} 
+0

java.util.Map에는 "addEntryListener"라는 메서드가 없습니다. – GuiSim

+1

맞습니다. 다음과 같았습니다 : com.hazelcast.core.IMap map = Hazelcast.getMap ("default"); 실제로 ReplicatedMap 구현을 Hazelcast에 직접 적용하여 훨씬 쉽게 작업을 수행 할 것입니다. –

+0

알겠습니다, 감사합니다 Talip! :) – GuiSim

9

Infinispan - http://www.jboss.org/infinispan/으로 생각하십니까? API는 매우 간단하며 표준 (JSR-107)을 기반으로합니다. 사용법은

CacheManager manager = new DefaultCacheManager(
       GlobalConfiguration.getClusteredDefault()); 

Cache cache = manager.getCache(); 

cache.put("key", "value"); 

--Hardy

+0

또 다른 매우 유망한 솔루션입니다. 감사 ! – GuiSim

3

나는이 지역에서 몇 가지 기술을 사용, 내가보기 엔 당신이 뭘하려는 건지 최선의 선택으로 JBoss Cache을 추천했습니다 또한 매우 간단합니다. JGroups를 전송으로 사용하지만 더 높은 수준의 트랜잭션 추상화를 제공합니다. 바로 사용할 수있는 분산 트리 노드 구조를 제공합니다.

편집 : 오, JBossCache는 JBoss Application Server와는 별개이며 모든 환경에서 사용할 수 있습니다. 무엇보다 JBossAS 밖에서는 JBossAS보다 더 잘 작동합니다.

0

http://ehcache.org/은 매우 양호하고 가벼운 캐시입니다. 여러 JVM간에 공유 될 수 있습니다. 내부적으로 JGroups를 사용할 수 있습니다.