Con el rápido aumento de las aplicaciones de alto tráfico, la escalabilidad es la necesidad de esta era. Por esta razón, los sistemas de almacenamiento en caché distribuido se han abierto camino en el corazón y el alma de las aplicaciones actuales. NCache – el caché distribuido líder para aplicaciones .NET, no es una excepción a esto.
Cuando generalmente consideramos un sistema de almacenamiento en caché, naturalmente se piensa que es volátil y no persistente, que los datos almacenados en el caché ya no estarán disponibles si el caché se reinicia.
Supongamos que una tienda de comercio electrónico en línea con cientos y miles de transacciones de usuarios cada día guarda todos sus datos en un caché distribuido, lo que hace que los usuarios tengan que acceder a esos datos a un ritmo muy rápido. La tienda de comercio electrónico quiere guardar todos sus datos en una memoria caché distribuida que no sea volátil y retener los datos incluso si la memoria caché falla o se reinicia debido a cualquier circunstancia imprevista.
Tenemos una solución que utiliza NCacheimplementaciones del lado del servidor para modificar su caché y hacerla persistente. Puede encontrar la solución en GitHub como NCache Caché persistente. Esta solución utiliza proveedores Read-Thru y Write-Thru para modificar el comportamiento de la memoria caché como una memoria caché persistente. Un caché persistente de ninguna manera es un reemplazo de su base de datos regular, sino simplemente una extensión para hacerla más rápida y accesible. Se puede implementar con los dos principales sistemas de base de datos de NET, SQL y Cosmos DB, sin necesidad de ningún código adicional. Echemos un vistazo más detallado a esto.
Usar NCacheCaracterísticas de una caché persistente
NCache El almacén de datos persistente le permite almacenar datos durante períodos de tiempo más prolongados. Normalmente, los datos se almacenan en un almacén persistente con un tiempo de caducidad predefinido o hasta que la aplicación envía un comando de eliminación. El almacén persistente se encuentra fuera del caché distribuido y todos los datos almacenados en el caché se guardarán automáticamente en el almacén persistente para que estén disponibles cuando el caché se borre debido a su naturaleza volátil. En cada solicitud de lectura realizada por la aplicación, si no hay datos solicitados en la memoria caché, la memoria caché recuperará automáticamente la entrada del almacenamiento persistente y no se perderán los datos de la memoria caché. Esto se muestra en la Figura 1:
NCache El almacenamiento persistente le proporciona las siguientes características de implementación del lado del servidor para garantizar transacciones fluidas y sin inconvenientes cuando los datos almacenados en el caché no están disponibles.
- Cargador de inicio persistente: Este proveedor carga datos en la memoria caché desde el almacén persistente cada vez que se inicia la memoria caché. Con cada operación de escritura realizada en la memoria caché, el almacenamiento persistente se actualiza y todos los datos persistentes se cargan en la memoria caché cada vez que se reinicia la memoria caché. Por lo tanto, no habrá pérdida en los datos almacenados en caché, incluso después de que el clúster de caché completo se caiga por cualquier motivo y luego comience de nuevo.
- Proveedor persistente de escritura directa: Este proveedor se llama automáticamente cuando escribe algo en la memoria caché persistente. Replica lo que se escribe en el almacén persistente para que permanezca disponible cuando se reinicia la memoria caché. Hay 2 opciones para configurar este proveedor: Write-Thru y Write-Behind. Estos permiten al usuario realizar la replicación en segundo plano o replicar antes de la operación de escritura.
Con Escribir-Thru, en cada operación de escritura, los datos se guardan simultáneamente en el almacenamiento persistente y luego se devuelve el control a la aplicación.
Con Escritura posterior, NCache pone en cola la operación y lo hace en segundo plano, devolviendo el flujo al usuario antes de que se realicen las operaciones de la base de datos. - Proveedor de lectura persistente: Se llama a este proveedor en caso de que el usuario requiera datos que no están disponibles en el caché. El clúster de caché que utiliza el proveedor de lectura completa obtendrá estos datos del almacén persistente y los conservará en el caché.
Ejemplo rápido de proveedor WriteThru de persistencia
Veamos un ejemplo rápido de cómo puede usar un caché persistente con NCache. En este ejemplo, agregaremos un elemento a la memoria caché usando el Proveedor WriteThru. Cuando el usuario agrega el elemento al caché, se llama al proveedor de escritura simultánea implementado con el servidor de caché y el elemento se guarda simultáneamente dentro del almacén de datos persistente. Ahora, en caso de que el caché se apague o el elemento se elimine del caché sin usar Write-Thru, el elemento se eliminará del caché pero no del almacenamiento persistente; los datos no se perderán ya que estarán dentro del almacén persistente. Cuando se requiera ese elemento, se obtendrá del almacén persistente a la memoria caché.
Aquí está el código básico que muestra la interfaz del proveedor Write-Thru.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
public class PersistenceWriteThruProvider : ProviderBase, IWriteThruProvider { public OperationResult WriteToDataSource(WriteOperation operation) { OperationResult operationResults = new OperationResult(operation, OperationResult.Status.Success); switch (operation.OperationType) { case WriteOperationType.Add: var items = new Dictionary<string, ProviderItemBase>(); items.Add(operation.Key, operation.ProviderItem); _persistenceProvider.Add(items); break; // Update and remove cases are similar and need to be handled } return operationResults; } } |
Así es como puede insertar un elemento en el caché con la escritura simultánea habilitada para que utilice su implementación de escritura simultánea implementada:
1 2 3 4 5 6 |
// Enable write through for the cacheItem created var writeThruOptions = new WriteThruOptions(); writeThruOptions.Mode = WriteMode.WriteThru; // Add the item in the cache with WriteThru enabled CacheItemVersion itemVersion = cache.Insert(key, cacheItem, writeThruOptions); |
NCache Detalles Documentos de almacenamiento en caché de escritura simultánea
Proveedor de lectura continua de persistencia
Supongamos que la aplicación quiere algunos datos del caché. Estos datos se almacenaban previamente en la memoria caché, pero por algún motivo ya no están disponibles. Normalmente, si el usuario intenta acceder a dichos datos, la memoria caché devolvería un valor nulo, ya que la memoria caché no contiene los datos necesarios y se tendría que escribir un código adicional que contenga consultas para obtener datos de la base de datos. Esto hará que la lógica de la aplicación se vuelva demasiado compleja. Primero se busca en la memoria caché el elemento requerido y, si no está disponible, se verifica la base de datos y luego se cargan los datos.
Cuando usamos el NCache almacén de datos persistente, los datos eliminados de la memoria caché aún se almacenarían en el almacén de datos persistente y la memoria caché llamaría al Proveedor de lectura a través implementación y los datos serían llamados en el caché y devueltos al usuario. Así que ahora obtendrá los datos deseados incluso si se han eliminado de la memoria caché sin necesidad de código adicional.
Aquí está el código básico que muestra la interfaz del proveedor Read-Thru:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
public class PersistenceReadThruProvider : ProviderBase, IReadThruProvider { public ProviderCacheItem LoadFromSource(string key) { return (ProviderCacheItem)(_persistenceProvider.Get(new string[] { key })[key]); } public ProviderDataTypeItem LoadDataTypeFromSource(string key, DistributedDataType dataType) { ... } public IDictionary<string, ProviderCacheItem> LoadFromSource(ICollection keys) { ... } } |
Puede obtener datos de la memoria caché con la lectura directa habilitada, de modo que si no existe en la memoria caché, los obtendrá de la fuente de datos según su implementación del proveedor de lectura directa.
1 2 3 4 5 6 |
// Specify the readThruOptions for read through operations var readThruOptions = new ReadThruOptions(); readThruOptions.Mode = ReadMode.ReadThru; // Retrieve the data of the corresponding item with reads thru enabled Product data = cache.Get(key, readThruOptions); |
NCache Detalles Documentos de almacenamiento en caché de lectura completa
Cargador de inicio de persistencia
Como se discutió anteriormente, un caché es volátil y todos los datos en un caché se borran una vez que se apaga el caché. Al reiniciar, la memoria caché está vacía y debe volver a llenarse. Cargar cada entrada cuando se requiere mediante el proveedor Read-Thru hace que el proceso de obtención de datos y operaciones sea más lento. ¿Qué pasaría si pudiéramos cargar todos los datos en el caché al inicio del caché? Con el Cargador de caché interfaz proporcionada por NCache, todos los datos del almacén persistente se duplican en la memoria caché al iniciarse para que estén disponibles para que los use la aplicación.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
public class PersistenceStartupLoader : ProviderBase, ICacheLoader { public LoaderResult LoadNext(object userContext) { if (persistentItems == null) persistentItems = _persistenceProvider.GetAll(); LoaderResult result = new LoaderResult(); foreach (var item in persistentItems) { result.Data.Add(new KeyValuePair<string, ProviderItemBase>(item.Key, item.Value)); } return result; } } |
NCache Detalles Documentos del cargador de inicio de caché
Eliminar datos del almacén de datos persistente
En la solución que hice, el almacén persistente está vinculado a su caché, por lo que cualquier cambio realizado dentro del caché también se realizará dentro del almacén persistente. Por ejemplo, un elemento de datos se almacena en caché, así como en un almacén persistente. Cuando el usuario lo elimine del caché, también hará que se elimine del almacenamiento persistente, con la ayuda del proveedor de escritura simultánea. Esto asegurará que el caché principal permanezca sincronizado con el almacén de datos persistente.
Sin embargo, esto es completamente flexible, puede modificarlo y tener elementos almacenados en el almacén persistente incluso si la aplicación envía un comando de eliminación.
¿Por qué NCache?
NCache es un caché distribuido en memoria rápido y escalable líder en el mercado hecho 100% para .NET / .NET Core aplicaciones Proporciona funciones del lado del servidor para admitir la persistencia de caché y hay muchas configuraciones que se pueden hacer para usar la persistencia de caché según sea necesario. Los datos pueden persistir desde la memoria caché a cualquier base de datos de nuestra elección. NCache almacena en caché los datos de la aplicación y elimina los cuellos de botella de rendimiento relacionados con el almacenamiento de datos y las bases de datos. Le permite almacenar sus datos en el caché durante períodos de tiempo más largos para asegurarse de que sus datos estén disponibles cuando los necesite. NCache El almacén de datos de persistencia elimina la necesidad de mover datos de la base de datos al caché cada vez que se inicia el caché. ¡Esto garantiza la alta disponibilidad de sus datos sin necesidad de escribir código adicional!
Pásate por NCache Docs para saber más sobre cómo puede implementar y usar NCache almacén de datos persistente junto con su caché distribuida.