EHCaché: Caché replicada por RMI

Primero algo sobre los mecanismos de Caché distribuida y replicada en EHCache:

· Caché distribuida con EHCache + Terracotta

o Permite a múltiples CacheManagers compartir datos entre JVMs.

o Los datos se comparten a través de un Servidor de Terracotta.

o Requiere poca configuración.

o La mejor opción si no nos importa pagarla :).

o Un ejemplo aquí.

· Caché replicada:

o EHCache ofrece diferentes mecanismos de replicación de cachés, basados en RMI, JGroups, JMS o un Servidor de Caché.

o En las cachés replicadas se pueden producir inconsistencias entre las cachés ante updates concurrentes de los datos de la caché,…

o La entrega puede ser síncrona o asíncrona. La entrega asíncrona es más rápida.

Funcionamiento EHCaché con caché replicada por RMI

· Si lo tenemos en diferentes clones tendríamos este despliegue:

· Cada Clon tendría una caché local que se estaría sincronizando.

· EHCaché recomienda caché replicada RMI por:

o Ser RMI un mecanismo de comunicación remota estándar Java (y maduro)

o Permite optimizar opciones TCP

· Temas interesantes/importantes tener en cuenta:

o Las claves y valores a meter en la caché deben ser Serializables

o El mecanismo de replicación es asíncrono: de esta forma se minimiza el tráfico de red necesario por ser RMI un protocol punto a punto.

o No hay caché master: son un conjunto de peers funcionando en conjunto. El reconocimiento de peers puede ser manual o automático (por multicast)

· Tipos de configuración: si tenemos 2 peers (Server 1 y Server 2) en una caché replicada:

o Configuración automática: por multicast busca los peers:

Configuración Server 1 y Server2:

<cacheManagerPeerProviderFactoryclass=»net.sf.ehcache.distribution.RMICacheManagerPeerProviderFactory»properties=»

peerDiscovery=automatic,

multicastGroupAddress=230.0.0.1,

multicastGroupPort=4446,

timeToLive=32″

/>

o Configuración manual: en cada peer indico la configuración de los otros peers indicando el nombre de las cachés a distribuir:

Configuración Server 1:

<cacheManagerPeerProviderFactoryclass=»net.sf.ehcache.distribution.RMICacheManagerPeerProviderFactory»properties=»

peerDiscovery=manual,

rmiUrls=//server2:40001/sampleCache11|//server2:40001/sampleCache12″

/>

Configuración Server2:

<cacheManagerPeerProviderFactoryclass=»net.sf.ehcache.distribution.RMICacheManagerPeerProviderFactory»properties=»

peerDiscovery=manual,

rmiUrls=//server1:40001/sampleCache11|//server1:40001/sampleCache12″

/>

· Ejemplo uso Caché replicada por RMI:

o Código:

// Testing the cache creation in ver 2.1CacheManager manager = new CacheManager(«/path/to/config/ehcache.xml»);// Get the instance of «MyCache»

Cache myCache = manager.getCache(«MyCache»);

// Add an element to «MyCache». Its preferred to have both key and value

// serializable

Element aCacheElement = new Element(key, value);

myCache.put(aCacheElement);

o Fichero ehcache.xml:

<?xml version=»1.0″ encoding=»UTF-8″?><ehcache xmlns:xsi=»<a href=»http://www.w3.org/2001/XMLSchema-instance&quot»rel=»nofollow»><a href=»http://www.w3.org/2001/XMLSchema-instance&quot;»>http://www.w3.org/2001/XMLSchema-instance&quot</a&gt;;xsi:noNamespaceSchemaLocation=»ehcache.xsd»

updateCheck=»true» monitoring=»autodetect»

dynamicConfig=»true» >

<diskStore path=»java.io.tmpdir»/>

<cacheManagerEventListenerFactory class=»» properties=»»/>

<defaultCache

maxElementsInMemory=»0″

eternal=»false»

timeToIdleSeconds=»1200″

timeToLiveSeconds=»1200″>

</defaultCache>

<!– For RMI replication (Setting the peer provider factory) –>

<cacheManagerPeerProviderFactory

class=»net.sf.ehcache.distribution.RMICacheManagerPeerProviderFactory»

properties=»peerDiscovery=manual, rmiUrls=//remoteHostIpAddress:40000/MyCache»

propertySeparator=»,» />

<!– For RMI replication (Setting the peer listener factory) –>

<cacheManagerPeerListenerFactory

class=»net.sf.ehcache.distribution.RMICacheManagerPeerListenerFactory»

properties=»hostName=localMachineIpAddress, port=40000, socketTimeoutMillis=120000″

propertySeparator=»,»/>

<cache name=»MyCache»

maxElementsInMemory=»1000″

eternal=»false»

overflowToDisk=»true»

diskSpoolBufferSizeMB=»20″

timeToLiveSeconds=»3000″

timeToIdleSeconds=»3000″

memoryStoreEvictionPolicy=»LFU»>

<!– Cache event listener –>

<cacheEventListenerFactory

class=»subin.cache.listener.factory.CacheEventListenerFactoryImpl»

properties=»» />

<!– RMI replication listener –>

<cacheEventListenerFactory

class=»net.sf.ehcache.distribution.RMICacheReplicatorFactory»

properties=»replicateAsynchronously=true,

replicatePuts=true,

replicatePutsViaCopy=true,

replicateUpdates=true,

replicateUpdatesViaCopy=true,

replicateRemovals=true» />

<!– RMI Cache bootstrap –>

<bootstrapCacheLoaderFactory

class=»net.sf.ehcache.distribution.RMIBootstrapCacheLoaderFactory»

properties=»bootstrapAsynchronously=true, maximumChunkSizeBytes=5000000″

propertySeparator=»,» />

</cache>

</ehcache>

Respuestas

    1. Hola,
      EHCaché es una de las cachés más usadas en el mundo Java (puedes leer algo más en el Blog sobre Cachés: https://unpocodejava.wordpress.com/2011/02/10/caches-y-spring/).
      EHCaché puede funcionar en modo replicado de modo que un grupo de nodos (máquinas virtuales) puedan compartir una caché, eso es lo que permite Caché con la replicación vía RMI :).

  1. […] "jqmodal", embeddedHeight: "400", embeddedWidth: "425", themeCSS: "" }); . EHCaché: Caché replicada por RMI « Java Mania . JMX: RMI vs. JMXMP « Mete Atamel . Java […]

Deja un comentario