2009-06-11 5 views
26

Estoy buscando un marco java que me permita compartir un caché entre varias JVM.Caché compartida del clúster

Lo que necesitaría es algo como pero sin la parte "distribuida". Deseo poder agregar un elemento en la memoria caché y sincronizarlo automáticamente con la otra memoria caché "miembro del grupo". Si es posible, me gustaría que la memoria caché se sincronice a través de una multidifusión confiable (o algo similar).

Miré Shoal pero lamentablemente la "Caché de estado distribuido" parece una implementación insuficiente para mis necesidades.

He visto JBoss Cache pero parece un poco exagerado para lo que tengo que hacer.

He visto JGroups, que parece ser la herramienta más prometedora para lo que tengo que hacer. ¿Alguien tiene experiencia con JGroups? ¿Preferiblemente si se usó como un caché compartido?

¿Alguna otra sugerencia?

Gracias!

EDITAR: Estamos pruebas para ayudar a decidir entre Hazelcast y Infinispan de partida, voy a aceptar una respuesta pronto.

EDIT: Debido a un cambio repentino de requisitos, ya no necesitamos un mapa distribuido. Utilizaremos JGroups para un marco de señalización de bajo nivel. Gracias a todos por su ayuda.

+1

Hazelcast e Infinispan? Hmmm. Estas no son tecnologías maduras ... Intenta presionar Ctrl-z en la demostración Hazelcast en un nodo. Cerebro dividido. ¡Infinispan todavía está en alfa! Le recomiendo que busque en http://java-source.net/open-source/cache-solutions un punto de partida. EHCache, OSCache y JBoss Cache son al menos tecnologías maduras bien aceptadas. Ya dijiste que Terracota es un peso pesado, así que está bien. Odio verte perder el tiempo y descubrir que te has ido con algo completamente inestable. –

+0

Aún no lo hemos decidido, solo estamos probando. Gracias por sus preocupaciones Taylor :) Además, CTRL-Z en la demostración Hazelcast funciona bien. Lo mismo ocurre con eliminar cualquier nodo a través del Administrador de tareas o de cualquier otra forma. – GuiSim

+0

Una vez más, Terracotta puede ayudarte aquí ;-). El bloqueo/señalización en Terracotta es increíblemente fácil. Aquí está la espera/notificación sincronizadas en el clúster para la señalización entre hilos en un clúster: http://www.terracotta.org/web/display/orgsite/Recipe?recipe=waitnotify –

Respuesta

8

Después de buscar un poco más, encontré JGroup's ReplicatedHashMap. No ha sido probado a fondo, pero parece un excelente comienzo. Cubre todos mis requisitos sin darme demasiadas características que no necesito. También es bastante flexible.Todavía estoy buscando la respuesta "perfecta" :)

Gracias por su respuesta.

+2

JBossCache es esencialmente una implementación de fuerza industrial de ReplicatedHashMap. Utiliza el mismo mecanismo de transporte JGroups subyacente. – skaffman

1

Memcached tiene varios Java Clients.

+0

No estoy trabajando en un servidor web. Supongo que el problema aquí es el término "caché" que no es realmente lo que estoy buscando. Necesito una estructura de datos compartida;) – GuiSim

+0

Memcached no tiene nada que ver con los servidores web. Es el tipo de cosa que estás buscando. –

5

¿Has considerado Terracotta? Podría ser exagerado: http://www.terracotta.org/web/display/orgsite/Data+Caching

Hubo un JSR en el área de almacenamiento en caché hace un tiempo, ¿alguno de los siguientes se ajusta a la ley: http://java-source.net/open-source/cache-solutions/jcache?

Personalmente usé FKache hace unos años y funcionó bien, pero no lo usé en modo distribuido.

¿Es importante que sea un caché distribuido con copias de datos locales? También está el material de JavaSpaces si es memoria compartida que necesita ...

+0

Consideré usar Terracotta y planeo usarlo como último recurso, ya que, como dijiste, es excesivo. – GuiSim

+1

No estoy seguro de entender el sentimiento aquí. Soy parcial, por supuesto, ya que trabajo para Terracotta, pero usar Terracotta para hacer un almacenamiento en caché simple es, de hecho, extremadamente fácil y debería proporcionarle un excelente rendimiento. Es tan simple como marcar un ConcurrentHashMap como agrupado y tiene un caché sincronizado. Vea aquí un ejemplo: http://www.terracotta.org/web/display/orgsite/Recipe?recipe=concurrenthashmap Y si quiere/necesita desalojo, puede obtenerlo de una biblioteca adicional: http: //www.terracotta.org/web/display/docs/Cache+Evictor –

+0

Mi único pequeño problema con Terracotta es que requiere un servidor para funcionar. No es 100% P2P. Sé que no lo he mencionado en mi pregunta, así que +1 para la respuesta :) – GuiSim

0

Mi opción es Java Caching System de Apache, tiene soporte para TCP Lateral Cache que en mi opinión es la función que necesita.

+0

Gracias por la sugerencia, pero, de la documentación: "[...] Las dos memorias caché locales podrían tener diferentes versiones del mismo elemento. Como la mayoría de los cachés, este está destinado a la obtención de alto y bajo uso, y esta ocurrencia indicaría un uso incorrecto ".. Una vez más, sospecho que el término" caché "probablemente no sea la palabra correcta para usar en mi situación. Tendré que poner datos en el "caché" tan a menudo como sea necesario para leerlo. – GuiSim

13

¿Qué tal esto?

Tenga un local ConcurrentHashMap como su caché local. Crea un mapa/caché distribuido de Hazelcast. Comience a escuchar los eventos de mapas distribuidos y actualice su ConcurrentHashMap local.

Ahora las memorias caché locales en cada miembro serán las mismas. Sintonización automática.

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 no tiene un método llamado "addEntryListener" .. – GuiSim

+1

tiene razón. se suponía que era: com.hazelcast.core.IMap map = Hazelcast.getMap ("predeterminado"); De hecho pondré una implementación de ReplicatedMap en Hazelcast directamente para hacer la vida mucho más fácil. –

+0

Muy bien, gracias Talip! :) – GuiSim

9

¿Has considerado Infinispan - http://www.jboss.org/infinispan/? La API es muy simple y se basa en un estándar (JSR-107). El uso es también muy simple

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

Cache cache = manager.getCache(); 

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

--Hardy

+0

Otra solución muy prometedora. Gracias ! – GuiSim

3

he utilizado unas pocas tecnologías en esta área, que recomiendo encarecidamente JBoss Cache como la mejor opción para lo que estamos tratando de hacer. Utiliza JGroups como su transporte, pero proporciona una abstracción transaccional de mayor nivel. Desde el primer momento, le ofrece una estructura distribuida de nodo de árbol.

editar: Ah, y JBossCache es independiente de JBoss Application Server, puede usarlo en cualquier entorno. En todo caso, funciona mejor fuera de JBossAS que dentro de él.

0

http://ehcache.org/ es muy buena y ligera caché. Se puede compartir entre varias JVM. Internamente puede usar JGroups.

Cuestiones relacionadas