Azure Cosmos DB est le nouveau NoSQL solution de base de données basée sur le cloud qui a gagné en popularité ces derniers temps. Tout le monde sait que l'utilisation de la mise en cache avec Cosmos DB améliore les performances des applications et optimise les coûts de transaction en réduisant les déplacements vers la base de données.
Cependant, la mise en cache des données Cosmos DB dans un cache distribué peut entraîner la création de deux copies de ces données, une dans la base de données et une dans le cache. Si une application qui n'a pas accès à votre cache modifie directement ces données dans Cosmos DB, votre cache n'en est pas conscient. Il en résulte que votre cache a une copie plus ancienne des données par rapport à la base de données.
Ces données obsolètes sont un problème majeur dans les applications multi-environnements à transactions élevées où le travail avec des données obsolètes laisse une grande empreinte sur les performances. Dans ce blog, je vais discuter de la façon dont vous pouvez continuer à utiliser la mise en cache tout en évitant ce problème de « données obsolètes ».
Synchronisation du cache avec Cosmos DB à l'aide NCache
NCache est une solution de mise en cache distribuée très puissante avec un ensemble abondant de fonctionnalités puissantes. Comme tout cache distribué, NCache se situe entre la base de données et l'application elle-même et met en cache les données de la base de données à utiliser par l'application ; ainsi, réduisant le temps de lecture/écriture de façon exponentielle. Il résout également le problème des données obsolètes (discuté précédemment) par une fonctionnalité connue sous le nom de NotifyExtensibleDependency.
Grâce à NotifyExtensibleDependency, vous pouvez écrire votre propre logique de dépendance de données personnalisée dans laquelle une notification d'une base de données (Cosmos DB dans ce cas) est traitée par NCache en utilisant le Modifier le flux mécanisme de Cosmos DB.
Toute modification dans Cosmos DB peut être capturée à l'aide de la logique du processeur Cosmos DB Change Feed qui est intégrée au code NotifyExtensibleDependency. C'est ainsi que le mécanisme de gestion des événements peut être utilisé pour appliquer l'invalidation du cache en réponse aux modifications du contenu de la base de données, garantissant ainsi que les données obsolètes ne persistent pas dans le cache.
Vous avez également la possibilité d'utiliser la fonction de fournisseur ReadThru de NCache pour améliorer encore les performances de votre application Cosmos DB. Grâce à cette fonctionnalité, vous pouvez activer le cache pour rechercher directement dans la base de données des éléments qui n'existent pas dans le cache. Non seulement le cache recherche les éléments demandés dans la base de données (Cosmos DB), mais il stocke également les éléments demandés dans le cache une fois la découverte réussie.
NCache Détails NotifiyExtensibleDependencyNotifiyExtensibleDependency Lire via la mise en cache
Cache de synchronisation avec Cosmos DB : un exemple rapide
Par exemple, vous utilisez Cosmos DB comme base de données pour votre boutique de commerce électronique et mettez en cache les données fréquemment utilisées dans NCache. Votre boutique contient des dizaines de milliers de produits et en moyenne un million de transactions ont lieu quotidiennement. NCache vous aide à réduire la charge de votre base de données Cosmos, mais il est possible que les données du cache deviennent obsolètes. Comme discuté ci-dessus, NCache résout ce problème grâce à sa fonction NotifyExtensibleDependency qui assure une fonctionnalité optimale de votre boutique E-Commerce.
L'exemple de code suivant illustre l'utilisation de la fonctionnalité NotifyExtensibleDependency. Dans cet exemple, un produit est chargé à partir de la base de données en fonction de son ID. Ensuite, NotifyExtensibleDependency est créé et enregistré pour le produit récupéré. Enfin, le produit, sous forme de CacheItem est inséré dans le cache avec la clé spécifiée.
En outre, CosmosDbNotificationDependency est le nom du fournisseur qui a été déployé sur votre cache. Ce fournisseur implémente le ICustomDependencyProvider interface.
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); |
Pour plus de détails sur la mise en œuvre, vous pouvez consulter notre GitHub dépôt.
NCache Détails NotifiyExtensibleDependencyNotifiyExtensibleDependency Opérations de cache dans NCache
Fournisseur de lecture directe pour le cache
La fonction de lecture directe de NCache (comme son nom l'indique) vous permet de lire le cache directement dans votre base de données (Cosmos DB) lorsque des éléments ne sont pas trouvés dans le cache. Cette fonctionnalité vous évite d'avoir à rechercher vous-même des éléments dans la base de données lorsque ces éléments demandés ne se trouvent pas dans le cache. Grâce à cette fonctionnalité, non seulement NCache lit votre base de données pour les éléments demandés, mais les insère également dans le cache pour vous pour des récupérations rapides à l'avenir.
L'exemple de code suivant récupère un élément avec la lecture amont activée, correspondant à la clé spécifiée « Product:1001 » à l'aide de la méthode 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 Détails Lire via la mise en cache Opérations de cache dans NCache
Conclusion
Pour résumer, NCache offre une solution flexible pour synchroniser les données entre Cosmos DB et le cache, évitant ainsi l'incohérence des données. NCache, une solution de mise en cache distribuée en mémoire, peut être un moyen idéal pour Cosmos DB de conserver des données à jour pour un accès et un traitement plus faciles.
NCache Détails Télécharger NCache Options de déploiement cloud pour NCache.