Cosmos DB est le nouveau NoSQL store publié dans le cloud Azure. Contrairement aux bases de données relationnelles, il est évolutif car il s'agit d'un service de base de données hébergé, il jouit donc d'une grande popularité parmi les transactions .NET et .NET Core applications. Cependant, en utilisant Cosmos DB, vous devez vous méfier des goulots d'étranglement des performances et des frais généraux liés à l'accès à la base de données, car Microsoft vous facture pour chaque transaction vers la base de données.
Bien que Cosmos DB soit évolutif en termes de capacité de transaction, il n'est pas aussi rapide car le service de base de données vit dans un réseau virtuel ou un abonnement distinct par rapport aux applications. Ainsi, même si vos applications s'exécutent dans le cloud Azure, l'accès à la base de données via le réseau virtuel entraînera un coup dur pour les performances.
Afin de résoudre ces deux problèmes, il est idéal d'introduire la mise en cache dans votre application Cosmos DB. Vous constaterez une amélioration drastique des performances de votre application et, en même temps, une réduction significative des coûts opérationnels, car 80 à 90 % du temps, votre application récupérera les données du cache au lieu de la base de données.
NCache Détails Cache de synchronisation avec Cosmos DB Utiliser la mise en cache avec Cosmos DB-Webinaire
Utilisation de la mise en cache avec Cosmos DB
L'extrait de code suivant explique comment utiliser la mise en cache avec Cosmos DB. Soi-disant, une instance Cosmos DB contient une collection de clients.
- Recherchez le client spécifié dans le cache en fonction de la clé de cache.
- Si l'élément ne se trouve pas dans le cache, interrogez Cosmos DB pour rechercher le client.
- Si le client existe dans la collection de la base de données, récupérez l'élément.
- Ajoutez le client spécifié au cache avec une valeur d'expiration de 5 minutes pour assurer la cohérence des données.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
// Generate a unique cache key string key = $"Customer:ALFKI"; // First look for data in cache var retrievedItem = cache.Get<Customer>(key); // If not found in the cache, fetch data from the database and add it to the cache if (retrievedItem == null) { // New instance of CosmosClient class using a primary connection string CosmosClient client = new CosmosClient("connection-string-from-portal"); // Get container object Container container = client.GetContainer("Northwind", "Customer"); // Create partition key and id // Here, the id is CustomerID and Partition Key is City in the Customer class PartitionKey partitionKey = new PartitionKey("Seattle"); String id = "ALFKI"; // Read item from the container using the id and partitionKey var itemResponse = container.ReadItemAsync<Customer>(id, partitionKey).Result; // get customer object from database response Customer customer = itemResponse.Resource; // Initialize cache item with customer data and set expiration var cacheItem = new CacheItem(customer); cacheItem.Expiration = new Expiration(ExpirationType.Absolute, TimeSpan.FromMinutes(5)); // Insert cacheItem in cache against the given key cache.Insert(key, cacheItem); } |
NCache Détails Dépendance extensible de notification NCache Docs
En utilisant NCache en tant que cache distribué avec Cosmos DB
Lorsque vous travaillez avec Cosmos DB, il est fort probable que votre application soit une application à transactions élevées s'exécutant dans un environnement multiserveur via un équilibreur de charge, effectuant de nombreux appels de base de données. De plus, un cache autonome ne sera pas possible dans cet environnement, vous avez donc besoin d'un cache distribué comme NCache entre l'application et la base de données.
A cache distribué vous permet d'ajouter plus de serveurs de cache à mesure que votre charge transactionnelle augmente, afin que le cache ne devienne jamais un goulot d'étranglement. Par conséquent, le nombre de vos serveurs d'application n'a pas d'importance car vous pouvez avoir suffisamment de serveurs de cache entre l'application et la base de données, contrairement à une base de données relationnelle qui est un point d'étranglement majeur pour toute évolutivité.
Alors que Cosmos DB évolue beaucoup plus efficacement qu'une base de données relationnelle, il n'est toujours pas à la hauteur d'un cache distribué en mémoire comme NCache qui se trouve avec le réseau virtuel de votre application. En fait, une partie du cache résidera dans le processus d'application lui-même (appelé un cache client), te donner mise en cache inProc la vitesse.
NCache Détails Opérations de cache dans NCache NCache Docs
Mise en cache de la collection d'éléments de base de données
En utilisant un cache distribué, vous pouvez améliorer considérablement les performances de votre application Cosmos DB en réduisant les déplacements de base de données sur le réseau, en particulier pour les opérations de lecture. Ainsi, bien que vous puissiez récupérer des entités uniques à partir de la base de données, une approche beaucoup plus économique en termes de débit et de réduction des R/U (Request per Units) consiste à récupérer la collection d'éléments de la base de données et à appliquer les opérations au niveau de la mise en cache.
Dans ce but, NCache permet la mise en cache de la collection en tant qu'élément unique mis en cache ainsi que la mise en cache des éléments individuels de la collection, chacun avec sa propre clé de cache désignée. Toute modification de l'état de la collection peut ensuite être transmise à la base de données à la fin des opérations.
NCache Détails Cache de synchronisation avec Cosmos DB NCache Docs
Collection de cache en tant qu'élément unique
Vous pouvez mettre en cache la collection en tant qu'élément unique si vous souhaitez charger les éléments de collection collectivement, par exemple, tous les clients allemands. Vous pouvez interroger Cosmos DB pour tous les clients en Allemagne et renvoyer les résultats sous la forme d'une liste unique qui peut ensuite être ajoutée au cache pour une utilisation ultérieure.
L'exemple de code suivant montre comment procéder pour récupérer la liste des clients allemands de la base de données.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
string key = $"CustomersFromGermany"; // First look for data in cache IDistributedList<Customer>germanCustomers = cache.DataTypeManager.GetList<Customer>(key); // If not found in the cache, fetch data from the database and add it to the cache if (germanCustomers == null) { // Create a query var query = new QueryDefinition("SELECT * FROM Customers c WHERE c.Country = 'Germany'"); // Get query iterator FeedIterator<Customer>feedIterator = container.GetItemQueryIterator<Customer>(query); // Specify expiration attribute for List var attributes = new DataTypeAttributes(); attributes.Expiration = new Expiration(ExpirationType.Absolute, TimeSpan.FromMinutes(5)); // Create a list to store customers as a collection germanCustomers = cache.DataTypeManager.CreateList<Customer>(key, attributes); // Read DB data using feed while (feedIterator.HasMoreResults) { var response = feedIterator.ReadNextAsync().Result.Resource; foreach (Customer customer in response) { germanCustomers.Add(customer); } } } |
NCache Détails Expiration dans le cache Opérations de cache dans NCache
Mettre en cache les éléments de collection séparément
Vous pouvez associer des métadonnées à des éléments de cache dans NCache pour catégoriser les données grâce à des identifiants uniques tels que étiquettes. De cette façon, vous pouvez récupérer plusieurs éléments du cache avec un seul identifiant, par exemple, des clients appartenant à l'Allemagne.
Pour ce faire, vous pouvez interroger les clients allemands dans Cosmos DB et associer une balise telle que Client : Pays : Allemagne aux éléments résultants. La mise en cache de ces éléments séparément les rendra disponibles pour diverses combinaisons de requêtes et des récupérations encore plus rapides d'un seul client.
En utilisant l'exemple précédent, nous recherchons d'abord dans le cache les clients avec la balise Customer: Country: Germany. Si les éléments n'existent pas dans le cache, interrogez Cosmos DB pour les éléments de la collection Customer, dont l'attribut « Country » est spécifié comme « Germany ». Cependant, puisque nous voulons maintenant mettre en cache les éléments de collection séparément, nous procédons comme suit :
- Une fois que vous avez extrait les éléments de la base de données, spécifiez la valeur d'expiration des éléments.
- Spécifiez l'étiquette Client : Pays : Allemagne pour chaque élément du cache.
- Ajoutez des éléments au cache en bloc.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
// Create a dictionary to add bulk items in the cache var collectionItems = new Dictionary<string, CacheItem>(); CacheItem cacheItem = null; var expiration = new Expiration(ExpirationType.Absolute, TimeSpan.FromMinutes(5)); // Read DB data using feed while (feedIterator.HasMoreResults) { var response = feedIterator.ReadNextAsync().Result.Resource; foreach (Customer customer in response) { cacheItem = new CacheItem(customer); cacheItem.Expiration = expiration; //Create a unique key for each item in collection string itemKey = $"Customer:{customer.CustomerID}"; // Add cacheItem to dictionary collectionItems.Add(itemKey, cacheItem); } } // Insert customer collection items seperately using bulk operation if (collectionItems.Count > 0) { cache.InsertBulk(collectionItems); } |
NCache Détails Balises en cache Opérations de cache dans NCache
NCache Déploiement dans Azure
Offre majeure des marketplaces cloud NCache, comme Azure et AWS, et le téléchargement pour une utilisation sur site. Pour tous les autres systèmes cloud, vous pouvez télécharger et installer NCache sur une machine virtuelle dans un modèle de Bring Your Own License (BYOL). NCache est déployé dans Azure de la manière suivante :
- Déployer NCache Cloud en azur
- Déployer NCache en tant que machines virtuelles
- En utilisant NCache dans une offre Platform-as-a-Service (PaaS) dans Azure.
Pour plus de détails sur ces options, consultez Options de déploiement cloud pour NCache.
NCache Détails NCache dans AWS NCache Cloud Service
Conclusion
En résumé, l'introduction de la mise en cache dans votre application Cosmos DB améliore la vitesse, la fiabilité et la disponibilité. En utilisant NCache avec Cosmos DB, les performances de l'application sont considérablement améliorées car le cache réside dans le processus d'application. Deuxièmement, une réduction drastique des coûts puisque 80 à 90 % de vos données sont accessibles sans effectuer de coûteux déplacements de base de données vers Cosmos DB.