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"»rel=»nofollow»><a href=»http://www.w3.org/2001/XMLSchema-instance"»>http://www.w3.org/2001/XMLSchema-instance"</a>;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> |



Replica a Gustavo Antonio Correa Caja Cancelar la respuesta