Análisis del entorno. Escenario tecnológico actual.
Los datos crecen de forma exponencial, las fuentes de datos se multiplican, hay una explosión en datos estructurados y no estructurados provenientes de múltiples dispositivos. Si las organizaciones quieren dar valor a sus clientes aprovechando esta explosión de información, hay que pensar en nuevas arquitecturas de software y hardware que ayude a las empresas a dar el valor mayor con el menor coste y en el menor tiempo de implantación. La solución de Software AG Terracotta se engloba dentro del marco del “BigData” para proponer una nueva arquitectura de los sistemas de información con el objetivo de dotar a los clientes de acceso instantáneo a los datos de negocio con un gran retorno de la inversión.
La nueva plataforma de datos en memoria propone la creación de una nueva capa tanto a nivel de servidor de aplicaciones (escalado vertical) como a nivel de servidores de datos en memoria de Terracotta (escalado horizontal), para que las aplicaciones encuentren los objetos de negocios en memoria con tiempos de acceso medidos en milisegundos antes de realizar conexiones menos agiles y costosas en las bases de datos y los sistemas de información tradicionales.
Arquitectura BigMemory
Terracotta BigMemory da a las aplicaciones Java instantáneo acceso a Gigabytes o Terabytes de datos, completamente transparente para las aplicaciones y sin los problemas del Garbage Collector de Java. BigMemory es un almacén de datos en memoria NOSQL clave-valor, que puede escalar a decenas de Terabytes con hardware convencional de manera rápida y eficaz.
Los componentes arquitectónicos son:
· EhCache: API de comunicación entre mis aplicaciones o frameworks de persistencia JAVA y BigMemory.
· BigMemory: Puede residir en la misma máquina virtual que el servidor de aplicaciones o cualquier JVM, donde accederemos a la área de memoria fuera del heap de la máquina virtual de tamaño ilimitado.
· BigMemory Terracotta Server Array: Servidores dedicados al almacenamiento en RAM, con alta disponibilidad y posibilidad de hacer búsquedas en la memoria total, entre otras características.
Diseñar con visión BigMemory
Tanto si diseñamos las aplicaciones de negocio bajo un prisma de servicios y/o orientado a tres capas (J2EE) con desacoplamiento de presentación, lógica y datos, podemos añadir un capa intermedia entre presentación/lógica y los datos para el acceso a memoria, es decir, las aplicaciones primero buscaran el dato en la cache de memoria local o distribuida, sin acceder a base de datos de forma automática. Este almacén de memoria es transaccional y se auto gestiona automáticamente.
Para integrar la cache distribuida en memoria, primeramente adoptaremos la librería de cache de datos open source ehCache de amplia aceptación en la comunidad Java y estándar de facto como API de Cache[1] .
Existen dos vías habituales del uso de la API ehCache, uno es simplemente habilitar la cache distribuida y local utilizando estándares de persistencia Java, como Hibernate y OpenJPA, utilizada en multitud de proyectos open source como LifeRay o estándares de desarrollo de aplicaciones Java como Spring.
La otra vía es adaptar la capa de persistencia (si no es estándar) para utilizar la cache de datos mediante la simplicidad y potencia de ehCache.
Ejemplos de uso completo de la solución lo podemos encontrar en la web de Terracotta: Hibernate+ehCache
El siguiente diagrama ilustra la solución de Terracotta con BigMemory a nivel de servidor de aplicaciones y BigMemory distribuido en un array de servidores.
Ejemplos de uso de la Arquitectura BigMemory
Existen ejemplos de uso de la plataforma, donde siguiendo tutoriales guiados podemos rápidamente ver como utilizar la arquitectura de BigMemory, son las recetas Recipes y también de forma muy ilustrativa podemos ver como utilizar la API de Cache en el siguiente enlace, Code-samples
A modo de ejemplo:
1. Crear un objeto cache, las caches se describen en el fichero ehcache.xml o de forma programática, por ejemplo:
<cache name=”ejemplo”
maxElementsInMemory=”10000″
maxElementsOnDisk=”1000″
eternal=”false”
overflowToDisk=”true”
timeToIdleSeconds=”300″
timeToLiveSeconds=”1″
memoryStoreEvictionPolicy=”LFU”
/>
maxElementsInMemory=”10000″
maxElementsOnDisk=”1000″
eternal=”false”
overflowToDisk=”true”
timeToIdleSeconds=”300″
timeToLiveSeconds=”1″
memoryStoreEvictionPolicy=”LFU”
/>
2. Creación de un objeto “ejemplo”
Cache cache = manager.getCache("sampleCache1");
3. Realizar operaciones CRUD con la cache “ejemplo”
Cache cache = manager.getCache("sampleCache1");
Element element = new Element("key1", "value1");
cache.put(element);
Cache cache = manager.getCache("sampleCache1");
cache.remove("key1");
4. Realizar operaciones de administración de la cache de forma programática, igualmente la solución esta dotada con una consola de administración para ver el estado de la cache. Obtenemos el tamaño de la cache (tanto en memoria con el diskstore) y el número de elementos
Cache cache = manager.getCache("sampleCache1");
int elementsInMemory = cache.getSize();
Cache cache = manager.getCache("sampleCache1");
long elementsInMemory = cache.getMemoryStoreSize();
Cache cache = manager.getCache("sampleCache1");
long elementsInMemory = cache.getDiskStoreSize();
5. Obtención de estadísticas de la memoria distribuida
Cache cache = manager.getCache("sampleCache1");
int hits = cache.getHitCount();
Cache cache = manager.getCache("sampleCache1");
int hits = cache.getMemoryStoreHitCount();
6. Modificación de forma dinámica de los parámetros de la cache
Cache cache = manager.getCache("sampleCache");
CacheConfiguration config = cache.getCacheConfiguration();
config.setTimeToIdleSeconds(60);
config.setTimeToLiveSeconds(120);
config.setmaxEntriesLocalHeap(10000);
config.setMaxElementsOnDisk(1000000);
7. Añadir varios elementos a la cache con colecciones
Configuration managerConfiguration = new Configuration();
managerConfiguration.name("config")
.terracotta(new TerracottaClientConfiguration().url("localhost:9510"))
.cache(new CacheConfiguration()
.name("bigMemory-crud")
.maxBytesLocalHeap(128, MemoryUnit.MEGABYTES)
.terracotta(new TerracottaConfiguration())
);
CacheManager manager = CacheManager.create(managerConfiguration);
Cache bigMemory = manager.getCache("bigMemory-crud");
Collection elements = new ArrayList();
elements.add(new Element("1", new Person("Jane Doe", 35,
Person.Gender.FEMALE, "eck street", "San Mateo", "CA")));
elements.add(new Element("2", new Person("Marie Antoinette", 23,
Person.Gender.FEMALE, "berry st", "Parsippany", "LA")));
elements.add(new Element("3", new Person("John Smith", 25,
bigMemory.putAll(elements);
[1]Ver Detalles en JSR 107: JCache – Java Temporary Caching API

