A menudo nuestros sistemas se vuelven más lentos en responder, porque son necesarios varios accesos a base de datos, o es necesario realizar varios cálculos antes. Otras veces sólo necesitamos velocidad a la hora de obtener determinados datos de memoria, por ejemplo para validar tokens de sesión o para datos de uso frecuentes en cálculos.
Cuando se nos plantean estas circunstancias, entre otras, probablemente lo que nuestro sistema necesita sea incorporar un sistema de caché.
En este post vamos a hablar de los sistemas de caché que podemos utilizar. Veremos una descripción general de qué son, qué tipos hay y cuáles son los más populares.
La mayoría ya sabréis qué es una caché, pero para aquellos que no lo tengan tan claro, podemos definirla como una capa de almacenamiento de datos de alta velocidad que almacena temporalmente información.
De este modo, en futuras peticiones, podrán servirse de forma más rápida los datos, que si se ha de ir al sistema de almacenamiento principal; o servir cálculos previamente realizados, sin necesidad de volver a repetirlos.
Con el uso de cachés se obtienen una serie de ventajas:
- Mejora del rendimiento de la aplicación.
- Reducción de costes. Con bases de datos tradicionales y hardware basado en discos, aumentar los recursos no implica que se vaya a obtener mejoras en la latencia como sí suele ofrecer una caché.
- Reducción de la carga en el back-end.
- Aumento del rendimiento de lectura (medida por las entradas salidas por segundo IOPS - Inputs Outputs Per Second), reducción de la latencia y velocidades de solicitud mucho más elevadas respecto a una base de datos basada en disco.
El orden en el que se almacenan los datos en la caché dependerá de cuáles son los más requeridos; permanecerán los más solicitados, mientras que los que menos se usen se borrarán de la caché, pero no del sistema principal.
El desalojo de los elementos de caché dependerá de las políticas de desalojo que se establezcan o del timeout de los elementos.
Habitualmente las cachés suelen usarse para almacenar:
- Resultados de consultas a base de datos.
- Cálculos complejos.
- Solicitudes y respuestas de APIs.
- Páginas web, para almacenar el contenido de páginas HTML o fragmentos de éstas.
- Información de sesión de usuarios, tokens de sesión.
- Cualquier información que necesitemos, dada la diversidad de tipos de datos que los sistemas de caché soportan.
Están contenidas en la aplicación, comparten el mismo espacio dinámico de memoria. Ejemplos de este tipo de caché Google Guava Cache, EhCache (aunque también proporciona posibilidad de configurarla en modo distribuido), etc.
Puede estar desplegada en uno o varios nodos formando una gran caché lógica**, puede ser externa a la aplicación o interna. Ejemplos de este tipo encontramos, por ejemplo Redis, MongoDB in Memory, Memcached, etc.**
Redis, de Redis Lab, es un sistema de almacenamiento de estructura de datos en memoria de código abierto. Además de usarse como caché, también se puede utilizar como base de datos y como broker de mensajería.
- Tipo de caché: Caché para sistemas distribuidos y desacoplada de la aplicación.
- Tipos de datos: Strings, hashes, listas, sets, mapas de bits, índices geoespaciales, etc.
- Replicación/escalado: incorpora replicación con replicación maestro-esclavo trivial a la configuración, con primera sincronización rápida sin bloqueo, autoconexión con resincronización parcial en la división de red.
- Alta disponibilidad: soporta alta disponibilidad a través de Redis Sentinel y particiones automáticas con Redis Cluster.
- Cloud: soporte cloud con un alto rendimiento garantizado, escalabilidad sin esfuerzo y características robustas de alta disponibilidad que incluyen persistencia, replicación crosszone/region/datacenter y failover automático instantáneo, sin pérdida de datos. Disponible en Openshift, Amazon Web Services, Microsoft Azure, Google Cloud Platform, IBM SoftLayer, Heroku, Pivotal Web Services, etc.
- Seguridad: soporta autenticación básica, pero no encriptación de datos.
- Redis no ofrece características de near cache, pero desde Redis recomiendan su implementación mediante la librería Redisson.
- Licencia/Soporte: liberada bajo licencia BSD con 3 cláusulas. Disponen de soporte 24x7 por expertos.
Hazelcast es un sistema de almacenamiento distribuido, de código abierto, que ayuda a administrar sus datos y distribuir el procesamiento utilizando el almacenamiento en memoria y la ejecución paralela. Proporciona un recurso de memoria altamente elástico y resiliente a las aplicaciones.
- Tipo de caché: caché para sistemas distribuidos e integrada en las aplicaciones.
- Tipos de datos: set, listas, map, multimap, queues, lock, idGenerator (para la generación de identificadores únicos a través de las aplicaciones del cluster), etc.
- Replicación/escalado: Hazelcast es un grid elásticamente escalable, permite escalar de forma predecible las aplicaciones al proporcionar acceso en memoria a los datos utilizados con frecuencia. Permite que cualquier red de máquinas agrupe y agrupe dinámicamente tanto la memoria como los procesadores para acelerar el rendimiento de la aplicación.
- Soporta alta disponibilidad. Escalabilidad elástica, basta con añadir más servidores y ellos se registran en el cluster.
- Cloud: disponible para su despliegue en las diferentes plataformas cloud: Hazelcast IMDG AWS (cloud module para ayudar a los miembros del cluster a descubrirse, compatible con IAM role y la conexión con clientes del cluster fuera de la nube), Hazelcast IMDG tiene soporte con Apache jclouds API, Azure Cloud Discovery, Pivotal Cloud Froundy, Openshift Container Platform.
- Seguridad: dispone de una suite de seguridad disponible para Hazelcast IMDG enterprise HD Hazelcast IMDG enterprise. Soporta autenticación y autorización, así como diferentes algoritmos de encriptación.
- Según la versión y licencia utilizada dispone de herramientas para la gestión del cluster. Es posible configurar near caché para optimizar las consultas remotas.
- Licencia/Soporte: dispone de 3 tipos de licencias Hazelcast IMDG Enterprise HD incluye soporte 24x7 con acuerdo de nivel de servicio de 1h, revisión de solicitudes de funciones, soporte telefónico, etc; Hazelcast IMDG Enterprise incluye soporte 24x7 con acuerdo de nivel de servicio de 1h, revisión de funciones, soporte telefónico, etc. y Hazelcast IMDG Professional que incluye servicio y soporte de 24x7, con acuerdo de nivel de servicio de 4h, revisión de solicitudes, soporte telefónico, etc.
MongoDB in memory es una base de datos documental open source, que permite fácilmente escalar, flexible y distribuida. A partir de la versión 3.2.6 el motor de almacenamiento en memoria forma parte de la disponibilidad general de (GA) en las compilaciones de 64 bits.
A parte de algunos metadatos y datos de diagnóstico no almacena nada en disco, lo que permite una latencia más predecible de las operaciones de base de datos.
- Tipo de caché: caché para sistemas distribuidos y desacoplada de la aplicación.
- Tipos de datos: documentos en formato JSON.
- Replicación/escalado: el motor de almacenamiento de datos en memoria puede ejecutarse como parte de un conjunto de réplicas o como parte de un clúster fragmentado.
- Soporta alta disponibilidad: Con escalado horizontal y distribuida. Soporta replica set.
- Cloud: proporciona servicio en la nube para ejecutar, monitorizar y mantener despliegues de MongoDB. Amazon Web Services, Microsoft Azure, Google Cloud Platform, Openstack.
- Seguridad: soporta autenticación/autorización, whitelist, TLS/SSL, etc.
- Alto rendimiento en escrituras y lecturas.
- Licencia/Soporte: publicada bajo la licencia de GNU Affero General Public.
Couchbase dispone de una solución para caché que ofrece un alto rendimiento, es fácil de implementar, escalar y administrar. Es una base de datos open source, distribuida, NoSQL orientada a documentos.
Expone una caché clave-valor para consultas rápidas y un potente motor de consultas para consultas de tipo SQL. Para entornos móviles e Internet de las Cosas (IoT) Couchbase también puede ejecutarse nativamente en el dispositivo y gestionar la sincronización con el servidor.
Couchbase Inc es una compañía privada de software que desarrolla y proporciona paquetes comerciales y soporte para Couchbase Server y Couchbase Lite ambos de código abierto, NoSQL, multimodelo, base de datos orientada a documentos, almacena documentos en formato JSON or base de datos como clave-valor.
- Tipo de caché: caché para sistemas distribuidos y desacoplada de la aplicación.
- Tipos de datos: Couchbase Server es una base de datos multimodelo que manipula datos de forma nativa en forma de clave-valor o documentos JSON.
- Replicación/escalado: i_ntra-cluster replication_ (replicación entre nodos del clúster) y Replicación Cross DataCenter (XDCR, para la replicación de datos entre clústeres). *Rack-ZoneAwareness *(replicación por zonas, permite habilitar agrupaciones lógicas de servidores en un clúster donde cada grupo de servidores pertenece físicamente a un rack o zona de disponibilidad, sólo disponible en la versión Enterprise Edition).
- Soporta alta disponibilidad. Escalado elástico bajo demanda (sin puntos únicos de fallo); escalado multi-dimensional (escalar o ampliar servicio de base de datos individuales, como datos, consultas, índices, búsquedas para utilizar de forma más eficientes distintos tipos de instancias en la nube.
- Cloud: permite implementaciones en contenedores y en la nube. Admite todas las plataforma Cloud, así como una variedad de tecnologías de contenedores y virtualización: Amazon Web Services, Microsoft Azure, Google Cloud Platform Live, Joyent, Docker, Red hat, Openshift.
La tecnología Couchbase Cross Datacenter Replication (XDCR) está diseñada para la nube, con características como el filtrado de datos, detección de cambios en la topología e integra tolerancia de fallos. Se puede migrar datos distribuidos a través de clusters y nubes de forma fácil.
- Seguridad: proporciona seguridad de datos a todos los niveles: infraestructura, como aplicación como de base de datos: autenticación, autorización, auditoría, encriptación.
- Buen rendimiento con baja latencia.
- Licencia/Soporte: liberada en diferentes versiones: *Enterprise edition *que incluye una licencia comercial, soporte técnico con compromisos de servicio 24x7, soporte técnico y soluciones para versiones anteriores; Community edition, pensada para desarrolladores, existen manuales, listas de correo, etc. y Open source Couchbase está comprometido con el desarrollo de código abierto y sirve como base para la edición community y como plataforma de innovación en Couchbase.
Memcached es un sistema de almacenamiento en memoria distribuida, open source, de alto rendimiento y de uso general. Es simple pero muy potente. Tiene como principales características:
- Tipo de caché: caché para sistemas distribuidos y desacoplada de la aplicación.
- Tipos de datos: strings, objetos pequeños
- Replicación/escalado: no existe la replicación, sincronización ni broadcasting por defecto, aunque se apoya en otras herramientas de terceros como Repcached para la replicación de los datos entre nodos.
- Soporta alta disponibilidad. Se apoya en herramientas de terceros para asegurar la alta disponibilidad.
- Cloud: Amazon ElastiCache (permite escalado horizontal y vertical), *Memcached Cloud (alto rendimiento, escalabilidad sin esfuerzo, replicación crosszone/region/datacenter y failover automático instantáneo, sin pérdida de datos. Memcached de Redis Labs Cloud, Amazon Web Services, Microsoft Azure, Google Cloud Platform, IBM SoftLayer, Openshift...
- Recomendado para el almacenamiento pequeño de datos.
- Licencia: distribuido bajo licencia BSD
Ehcache es un sistema de caché clave-valor, opensource, basada en estándares, que aumenta el rendimiento, al descargar la base de datos y simplificar la escalabilidad. Tiene integración con diferentes frameworks y librerías.
Es usada en diferentes tipologías Standalone (se mantiene en un sólo nodo, sin comunicación entre nodos.
Si hay varias instancias de una aplicación, entonces existe coherencia débil entre ellos), Distribuido (Los datos se mantienen a través de un conjunto de servidores Terracotta y dispone de un conjunto de modos de consistencia) y en modo Replicado (los datos se mantienen en todos los nodos y se replican en el clúster sin bloqueo, replicación síncrona o asíncrona. Consistencia débil en esta topología).
- Tipo de cache: caché local o en proceso.
- Tipos de datos: estructura de datos distribuida, NoSQL, schema-less.
- Replicación/escalado: fácil escalado añadiendo nuevos servidores. Replicación con RMI, replicación con JGroups, replicación con JMX.
- Soporta alta disponibilidad. En la última versión fortalece sus capacidades de caché distribuida a través de la generación de servidores Terracota. Facilita el escalado desde el almacenamiento en proceso, o un mixto con despliegue en proceso y fuera con cachés de tamaño de terabytes.
- Seguridad: no aplica, aunque los servidores sí que permiten utilizar mecanismos de autenticación y autorización.
- Recomendado para sistemas de alta concurrencia.
- Acoplada en las aplicaciones. Con la última versión, compila de forma nativa con JSR107, soporta almacenamiento con off-heap e incorpora otras mejoras como on-heap Store, disk Store, clustered Store, bigMemory.
- Licencia: bajo licencia Apache 2.0.
Son muchas las opciones que existen en el mercado, pero cuál elegir dependerá, entre otras cosas, de las necesidades concretas del proyecto y de la arquitectura.
En Paradigma nos gustan las tecnologías y nos gusta estar a la última en las tendencias tecnologías pero a la hora de elegir cuál usar, siempre intentamos buscar la que mejor encaje con las necesidades del proyecto.
Cuéntanos qué te parece.