Azure Cosmos DB es el nuevo NoSQL solución de base de datos basada en la nube que ha ganado mucha popularidad en los últimos tiempos. Todo el mundo sabe que el uso del almacenamiento en caché con Cosmos DB aumenta el rendimiento de las aplicaciones y optimiza los costos de transacción al reducir los viajes a la base de datos.
Sin embargo, el almacenamiento en caché de datos de Cosmos DB en una memoria caché distribuida puede dar lugar a la creación de dos copias de estos datos, una en la base de datos y otra en la memoria caché. Si alguna aplicación que no tiene acceso a su caché cambia directamente estos datos en Cosmos DB, su caché no lo sabe. Esto da como resultado que su caché tenga una copia más antigua de los datos en comparación con la base de datos.
Estos datos obsoletos son un problema importante en las aplicaciones multientorno de muchas transacciones en las que trabajar con datos obsoletos deja una gran huella en el rendimiento. En este blog, discutiré cómo puede continuar usando el almacenamiento en caché y aún así evitar este problema de "datos obsoletos".
Sincronización de caché con Cosmos DB usando NCache
NCache es una solución de almacenamiento en caché distribuido muy poderosa con un conjunto abundante de características poderosas. Al igual que cualquier caché distribuida, NCache se encuentra entre la base de datos y la propia aplicación y almacena en caché los datos de la base de datos para que la aplicación los utilice; por lo tanto, reduciendo el tiempo de lectura/escritura exponencialmente. También resuelve el problema de los datos obsoletos (discutido anteriormente) mediante una característica conocida como NotifyExtensibleDependencyNotifyExtensibleDependency.
A través de NotifyExtensibleDependency, puede escribir su propia lógica de dependencia de datos personalizada en la que una notificación de una base de datos (Cosmos DB en este caso) es procesada por NCache haciendo uso de la Cambiar alimentación mecanismo de Cosmos DB.
Cualquier modificación en Cosmos DB se puede capturar mediante la lógica del procesador de fuente de cambios de Cosmos DB que está integrada en el código NotifyExtensibleDependency. Así es como se puede usar el mecanismo de manejo de eventos para imponer la invalidación de la memoria caché en respuesta a modificaciones en el contenido de la base de datos, asegurando así que los datos obsoletos no persistan en la memoria caché.
También tiene la opción de utilizar la función de proveedor ReadThru de NCache para mejorar aún más el rendimiento de su aplicación Cosmos DB. A través de esta característica, puede habilitar el caché para buscar directamente en la base de datos elementos que no existen en el caché. La memoria caché no solo busca los elementos solicitados en la base de datos (Cosmos DB), sino que también almacena los elementos solicitados dentro de la memoria caché cuando se detectan correctamente.
NCache Detalles NotificarExtensibleDependencia Leer a través del almacenamiento en caché
Sincronización de caché con Cosmos DB: un ejemplo rápido
Por ejemplo, está utilizando Cosmos DB como base de datos para su tienda de comercio electrónico y almacena en caché datos de uso frecuente en NCache. Su tienda contiene decenas de miles de productos y en promedio se realizan un millón de transacciones diarias. NCache lo ayuda a reducir la carga en su base de datos Cosmos, pero existe la posibilidad de que los datos en el caché se vuelvan obsoletos. Como se discutió anteriormente, NCache resuelve este problema mediante su función NotifyExtensibleDependency que garantiza una funcionalidad óptima de su tienda de comercio electrónico.
El siguiente ejemplo de código demuestra el uso de la función NotifyExtensibleDependency. En este ejemplo, un producto se carga desde la base de datos en función de su ID. Luego se crea NotifyExtensibleDependency y se registra en el producto obtenido. Finalmente, el producto, en forma de Artículo de caché se inserta en la memoria caché con la clave especificada.
Además, CosmosDbNotificationDependency es el nombre del proveedor que se implementó en su caché. Este proveedor implementa el ICustomDependencyProviderICustomDependencyProvider de la interfaz del.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
Product product = LoadProductFromDatabase(productId); string providerName = "CosmosDbNotificationDependency"; //This is the name of your provider deployed on cache server string key = "Product#" + product.Id ; IDictionary<string, string> parameters = new Dictionary<string, string>(); parameters.Add("Key", key); parameters.Add("CacheId", "myCache"); parameters.Add("EndPoint", ""); parameters.Add("AuthKey", ""); parameters.Add("DatabaseName", "demoDatabase"); parameters.Add("MonitoredCollection", "Customers"); parameters.Add("LeaseEndPoint", ""); parameters.Add("LeaseAuthKey", ""); parameters.Add("LeaseDatabaseName", "demoDatabase"); parameters.Add("LeaseCollection", "leases"); CacheItem item = new CacheItem(product); item.Dependency = new CustomDependency(providerName, parameters); _cache.Insert(key, item); |
Para obtener más detalles relacionados con la implementación, puede consultar nuestro GitHub repositorio.
NCache Detalles NotificarExtensibleDependencia Operaciones de caché en NCache
Proveedor de lectura para caché
La función de lectura completa de NCache (como sugiere el nombre) le permite leer el caché directamente en su base de datos (Cosmos DB) cuando no se encuentran elementos en el caché. Básicamente, esta característica le ahorra la molestia de buscar elementos en la base de datos cuando los elementos solicitados no se encuentran en el caché. A través de esta característica, no sólo NCache lee su base de datos para los elementos solicitados, pero también los inserta en el caché para que pueda recuperarlos rápidamente en el futuro.
El siguiente ejemplo de código recupera un elemento con la lectura a través habilitada, correspondiente a la clave especificada "Producto: 1001" mediante el método Get<>.
1 2 3 4 5 6 7 8 9 |
// Specify the key of the item string key = "Product:1001"; // 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 Leer a través del almacenamiento en caché Operaciones de caché en NCache
Conclusión
Para resumir, NCache ofrece una solución flexible para sincronizar datos entre Cosmos DB y la memoria caché, evitando así la incoherencia de los datos. NCache, una solución de almacenamiento en caché distribuida en memoria, puede ser un medio ideal para que Cosmos DB mantenga datos actualizados para facilitar el acceso y el procesamiento.
NCache Detalles Descargar NCache Opciones de implementación en la nube para NCache.