2009-06-11 15 views
26

Sto cercando un framework java che mi consenta di condividere una cache tra più JVM.Cluster Shared Cache

Quello che mi serve è qualcosa come ma senza la parte "distribuita". Voglio essere in grado di aggiungere un elemento nella cache e farlo sincronizzare automaticamente con l'altra cache "membro del gruppo". Se possibile, vorrei che la cache venisse sincronizzata tramite un multicast affidabile (o qualcosa di simile).

Ho guardato allo Shoal ma purtroppo la "cache di stato distribuita" sembra un'implementazione insufficiente per le mie esigenze.

Ho visto JBoss Cache ma sembra un po 'eccessivo per quello che devo fare.

Ho visto JGroups, che sembra essere lo strumento più promettente per quello che devo fare. Qualcuno ha esperienze con JGroups? Preferibilmente se fosse usato come cache condivisa?

Altri suggerimenti?

Grazie!

EDIT: Stiamo iniziando i test per aiutarci a decidere tra Hazelcast e Infinispan, accetterò presto una risposta.

MODIFICA: A causa di improvvisi cambiamenti di requisiti, non abbiamo più bisogno di una mappa distribuita. Useremo JGroups per un framework di segnalazione di basso livello. Grazie a tutti per il vostro aiuto.

+1

Hazelcast e Infinispan? Hmmm. Queste non sono tecnologie mature ... Prova a premere Ctrl-z nella demo Hazelcast in un nodo. Cervello diviso. Infinispan è ancora in alpha! Vi consiglio di guardare http://java-source.net/open-source/cache-solutions per un punto di partenza. EHCache, OSCache e JBoss Cache sono tecnologie mature ben accettate. Hai già detto che Terracotta è pesante, quindi va bene. Odio solo vederti sprecare il tuo tempo e scoprire che sei partito con qualcosa di completamente instabile. –

+0

Non abbiamo ancora deciso, stiamo solo testando. Grazie per le vostre preoccupazioni Taylor :) Inoltre, CTRL-Z nella demo Hazelcast funziona bene. Così uccide qualsiasi nodo tramite Task Manager o in qualsiasi altro modo. – GuiSim

+0

Ancora una volta, Terracotta può aiutarti qui ;-). Il blocco/segnalazione in Terracotta è incredibilmente facile. Qui è attesa/notifica sincronizzata attraverso il cluster per la segnalazione tra i thread in un cluster: http://www.terracotta.org/web/display/orgsite/Recipe?recipe=waitnotify –

risposta

8

Dopo un po 'di ricerca, ho trovato JGroup's ReplicatedHashMap. Non è stato testato a fondo, ma sembra un ottimo inizio. Riempie tutte le mie esigenze senza darmi troppe caratteristiche che non mi servono. È anche abbastanza flessibile.Sto ancora cercando la risposta "perfetta" :)

Grazie per le vostre risposte.

+2

JBossCache è essenzialmente un'implementazione industriale di ReplicatedHashMap. Utilizza lo stesso meccanismo di trasporto sottostante di JGroup. – skaffman

1

Memcached ha diversi Java Clients.

+0

Non sto lavorando su un server web. Suppongo che il problema qui sia il termine "cache" che non è proprio quello che sto cercando. Ho bisogno di una struttura dati condivisa;) – GuiSim

+0

Memcached non ha nulla a che fare con i server web. È il tipo di cosa che stai cercando. –

5

Avete considerato la terracotta? Potrebbe essere eccessivo: http://www.terracotta.org/web/display/orgsite/Data+Caching

C'era un JSR nell'area di cache un po 'di tempo fa, si adatta a uno dei seguenti requisiti: http://java-source.net/open-source/cache-solutions/jcache?

Ho usato FKache alcuni anni fa e ha funzionato bene, ma non l'ho usato in modalità distribuita.

È importante che si tratti di una cache distribuita con copie locali di dati? C'è anche la roba JavaSpaces se è la memoria condivisa che ti serve ...

+0

Ho pensato di usare Terracotta e ho intenzione di usarlo come ultima risorsa così com'è, come lei ha affermato, eccessivo. – GuiSim

+1

Non sono sicuro di aver compreso il sentimento qui. Naturalmente, sono di parte, visto che lavoro per Terracotta, ma usare Terracotta per fare semplici caching è in effetti estremamente semplice e dovrebbe fornire prestazioni eccellenti. È semplice come contrassegnare una ConcurrentHashMap come cluster e si dispone di una cache sincronizzata. Vedi qui per un esempio: http://www.terracotta.org/web/display/orgsite/Recipe?recipe=concurrenthashmap E se vuoi/hai bisogno di sfratto, puoi ottenerlo da una libreria aggiuntiva: http: //www.terracotta.org/web/display/docs/Cache+Evictor –

+0

Il mio unico piccolo problema con Terracotta è che richiede un server per funzionare. Non è al 100% P2P. So di non averlo menzionato nella mia domanda, quindi +1 per la risposta :) – GuiSim

0

La mia opzione è Java Caching System da Apache, ha il supporto di TCP Lateral Cache che a mio parere è la funzionalità che ti serve.

+0

Grazie per il suggerimento ma, dalla documentazione: "[...] Le due cache locali potrebbero potenzialmente avere versioni diverse dello stesso articolo. Come la maggior parte delle cache, questo è inteso per l'utilizzo high get e low put, e questo evento suggerirebbe un uso improprio ".. Ancora una volta sospetto che il termine" cache "non sia probabilmente la parola giusta da usare nella mia situazione. Dovrò inserire i dati nella "cache" tutte le volte che ho bisogno di leggerlo. – GuiSim

13

Che ne dici di questo?

Avere una ConcurrentHashMap locale come cache locale. Crea una mappa/cache distribuita con Hazelcast. Inizia ad ascoltare gli eventi della mappa distribuita e aggiorna la tua ConcurrentHashMap locale.

Ora le cache locali su ciascun membro saranno uguali. Auto-sincronizzato.

+0

java.util.Map non ha un metodo chiamato "addEntryListener" .. – GuiSim

+1

hai ragione. doveva essere: com.hazelcast.core.IMap map = Hazelcast.getMap ("default"); In effetti implementerò direttamente un'implementazione di ReplicatedMap in Hazelcast per rendere la vita molto più semplice. –

+0

Bene, grazie Talip! :) – GuiSim

9

Avete considerato Infinispan - http://www.jboss.org/infinispan/? L'API è molto semplice e basata su uno standard (JSR-107). L'utilizzo è molto semplice

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

Cache cache = manager.getCache(); 

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

--Hardy

+0

Un'altra soluzione molto promettente. Grazie ! – GuiSim

3

Ho usato alcune tecnologie in questo settore, posso raccomandare JBoss Cache come la scelta migliore per quello che stai cercando di fare. Utilizza JGroup come trasporto, ma fornisce un'astrazione transazionale di livello superiore. Fornisce immediatamente una struttura distribuita di nodi degli alberi.

modifica: Oh, e JBossCache è indipendente da JBoss Application Server, è possibile utilizzarlo in qualsiasi ambiente. Se mai, funziona meglio al di fuori di JBossAS di quanto non faccia al suo interno.

0

http://ehcache.org/ è una cache molto buona e leggera. Può essere condiviso tra più JVM. Internamente può usare JGroups.