caching – Tipos de Cache

Caching
Caching

Introducción

Caching en pocas palabras permite guardar datos en memoria para acceder a ella rápidamente. Se recomienda aplicar Caching cuando se necesita consultar la misma información más de una vez, como resultado las aplicaciones pueden obtener estos datos desde la Cache en lugar de recuperarla desde su fuente de datos original (base de datos, servicio web, etc). Al usar Cache en nuestras aplicaciones tenemos dos beneficios:

  • Podemos mejorar el rendimiento y la escalabilidad de la aplicación: reduce el tiempo de respuesta al cliente, el uso del CPU, la utilización de la base de datos y el ancho de banda.
Rendimiento y escalabilidad
Disminuye la cantidad de consultas a la base de datos
  • Podemos consultar datos desde la Cache aun cuando la fuente de datos no está disponible.
Fuente de datos no disponible
Fuente de datos no disponible

NOTA: Recomiendo revisar el artículo que habla acerca del Teorema CAP para recordar el comportamiento que tiene un sistema distribuido.

Tipos de cache

Creo que muchos solo conocen el tipo de Cache Local que es el que vive en el mismo proceso de un sitio web o en mejor de los casos se encuentra en un servidor dedicado, pero no es el único tipo de Cache que podemos usar en nuestra aplicación. A continuación veremos los tipos de Cache más comunes:

Cache Espejo (Mirrored Cache)

Una Cache Espejo está formada por un cluster de dos servidores activo/pasivo. Todas las peticiones de escritura y lectura que llegan se realizan sobre el servidor activo. En el caso de las operaciones Insert, Update o Delete que llegan al servidor activo se sincronizan en background a través de operaciones bulk con el servidor pasivo. Una Cache Espejo es tan rápido como el tipo Cache Local, pero al mismo tiempo ofrece confiabilidad (reliability) debido a la replicación que existe entre en servidor activo y pasivo, en caso el servidor activo quede inoperativo el servidor pasivo comienza a responder todas las peticiones.

ncache-mirrored-cache

Cache Replicada (Replicated Cache)

Una Cache Replicada consiste de dos o más servidores de Cache en un cluster. Cada servidor contiene todos los elementos que se encuentran en Cache y cualquier Update que se realice es sincronizado con todos los servidores del cluster. Al usar este tipo de Cache podemos realizar operaciones GET extremadamente rápidas, debido a que todos los servidores tienen el contenido completo de la cache, cada uno puede  responder a las peticiones que realicen los clientes. El punto en contra es que no es muy escalable para operaciones del tipo Update por la sincronización que debe realizar con los otros servidores en el cluster. Es recomendable usar este tipo de Cache cuando se requiere ejecutar más consultas que transacciones (Insert, Update, Delete) sobre la cache.

ncache-replicated-cache-l

Cache Particionada (Partitioned Cache)

También conocida como Cache Distribuida (Distributed Cache) este tipo de cache está destinada a almacenar gran cantidad de datos ya que es muy escalable, los datos en la cache se distribuye entre todos los servidores que forman el cluster. El costo de las operaciones Get o Update se mantienen constantes sin importar el tamaño de la cache, esto se debe a que internamente se crea un mapa de distribución que es enviado a todos los clientes para que accedan directamente al servidor que almacena los datos requeridos y pasa lo mismo con las actualizaciones, estas se realizan sobre un solo servidor. Se debe tener en cuenta que no existe replicación de datos en este tipo de cache, de modo que si uno de los servidores deja de funcionar se perderán muchos datos. En el caso que la cache sea la única fuente de datos este comportamiento no es aceptable, por ejemplo si hablamos de la sesión de Asp .Net, para los otros casos no hay problema en volver a poblar la cache.

ncache-partitioned-cache-l

Cache Replicada – Particionada (Partitioned – Replica Cache)

Este tipo de cache es una combinación de la Cache Particionada y Replicada y nos ofrece lo mejor de ambos mundos. Conseguimos la confiabilidad a través de la replicación y la escalabilidad a través de la partición. Este tipo de cache también usa un algoritmo HashMap para la distribución de los datos como la Cache Particionada, sin embargo cada partición se replica a un servidor en el cluster y este se mantiene en estado Pasivo a diferencia de la Cache Distribuida que copia los datos en todos los servidores del cluster. A la final cada servidor contiene una partición y una réplica de otro servidor, solo la partición Activa es accedida por los clientes.

ncache-partitioned-replica-cache

 Cache Local

La Cache Local no se conecta con un cluster cache, por lo general en este tipo de cache se almacenan datos pequeños de rápido acceso que no se necesitan compartir.

  • In Process: Este tipo de Cache Local reside en el mismo proceso donde se ejecuta la aplicación, por ejemplo la sesión de Asp .Net cuando usamos la configuración por defecto. Como puntos en contra tenemos que consume memoria del proceso principal, al reiniciar el proceso se pierde toda la información y no es escalable.
  • Out Process: Este tipo de Cache Local reside fuera del proceso de la aplicación o en un servidor dedicado.

Cachin InProcess

Cache Cliente (Client Cache)

También se le conoce como Near Cache, este tipo es básicamente un Cache stand-alone que se conecta al cluster de cache y mantiene la data sincronizada entre ambos nodos después de un periodo de tiempo. La cache cliente no forma parte del cluster, se comporta de manera local (In Process – Out Process) al servidor web o de aplicaciones y permite guardar los datos más consultados del servidor de cache, manteniendo la data cerca en lugar de ir de nuevo al cluster, este mecanismo ofrece una mejora en el rendimiento y escalabilidad.  Una Cache Cliente puede trabajar con cualquier tipo de cluster cache: Espejo, Particionada, Replicada y Particionada – replicada.

ncache-client-cache-l

Productos

Actualmente existen muchos productos en el mercado la decisión de cual elegir depende del lenguaje con el que trabajemos y las características que requiera nuestro sistema. Entre los productos más conocidos tenemos:

  • NCache
  • TayzGrid (*)
  • Redis
  • Coherence (*)
  • MemCache
  • Hazelcast (*)
  • Azure Cache
  • .net Memory Cache
  • AppFabric Cache
  • VM Ware GemFire (*)
  • IBM Xtreme Scale (*)

(*) Estos productos dejan de ser solo servidores de Cache ahora llegan a la categoría de In memory data grid.

Conclusiones:

Al usar un tipo de Cache podemos mejorar el rendimiento y la escalabilidad de una aplicación, también puede servir cuando la fuente de datos no está disponible ya que  permite guardar datos en memoria para acceder a ellos rápidamente. La Cache Espejo mantiene está formada por un cluster activo/pasivo y ambos contienen los mismos datos.  La Cache Replicada mantiene una copia de todos los datos en cada uno de los servidores que forman un cluster, en este caso todos los servidores están son activos. La Cache Distribuida divide los datos entre todos los servidores, cada uno tiene una porción de los datos. La Cache Replicada – Particionada distribuye y replica los datos entre los servidores. La Cache Local guarda los datos en memoria ya sea InProcess o OutProcess, normalmente es usada por una sola aplicación. Finalmente, la Cache Cliente se conecta a un cluster de cache para traer los datos más consultados y evitar viajes largos.

Referencias:
Metal Tip:

Este artículo lo escribí escuchando la canción Todo tiene su fin de la banda Medina Azahara de España, les comparto el enlace.

Happy coding and Stay Heavy lml

Deja un comentario