Avec l'augmentation rapide des applications à fort trafic, l'évolutivité est la nécessité de cette ère. Pour cette raison, les systèmes de mise en cache distribués ont fait leur chemin dans le cœur et l'âme des applications d'aujourd'hui. NCache – le principal cache distribué pour les applications .NET, ne fait pas exception à la règle.
Lorsque nous considérons généralement un système de mise en cache, il est naturellement considéré comme volatil et non persistant, que toutes les données stockées dans le cache ne seront plus disponibles si le cache redémarre.
Supposons qu'une boutique de commerce électronique en ligne avec des centaines et des milliers de transactions d'utilisateurs chaque jour enregistre toutes ses données dans un cache distribué, ce qui oblige les utilisateurs à accéder à ces données à un rythme très rapide. Le magasin de commerce électronique souhaite enregistrer toutes ses données dans un cache distribué non volatile et conserver les données même si le cache plante ou redémarre en raison de circonstances imprévues.
Nous avons une solution qui utilise NCacheles déploiements côté serveur de pour modifier votre cache et le rendre persistant. Vous pouvez trouver la solution sur GitHub comme NCache Cache persistant. Cette solution utilise des fournisseurs Read-Thru et Write-Thru pour modifier le comportement du cache en tant que cache persistant. Un cache persistant ne remplace en aucun cas votre base de données habituelle, mais simplement une extension pour la rendre plus rapide et plus accessible. Il peut être implémenté avec les deux principaux systèmes de base de données de NET, SQL et Cosmos DB, sans nécessiter de code supplémentaire. Voyons cela plus en détail.
En utilisant NCacheFonctionnalités de pour un cache persistant
NCache le magasin de données persistant vous permet de stocker des données sur des périodes plus longues. Normalement, les données sont stockées dans un magasin persistant avec un délai d'expiration prédéfini ou jusqu'à ce que l'application envoie une commande de suppression. Le magasin de persistance se trouve en dehors du cache distribué et toutes les données stockées dans le cache seront automatiquement enregistrées dans le magasin persistant pour être mises à disposition lorsque le cache sera nettoyé en raison de sa nature volatile. À chaque demande de lecture effectuée par l'application, s'il n'y a pas de données demandées dans le cache, le cache récupère automatiquement l'entrée du magasin persistant et aucune donnée de cache ne sera perdue. Ceci est illustré à la figure 1 :
NCache Le magasin persistant vous fournit les fonctionnalités de déploiement côté serveur suivantes pour garantir des transactions fluides et transparentes lorsque les données stockées dans le cache ne sont pas disponibles.
- Chargeur de démarrage persistant : Ce fournisseur charge les données dans le cache à partir du magasin persistant à chaque démarrage du cache. À chaque opération d'écriture effectuée dans le cache, le magasin persistant est mis à jour et toutes les données persistantes sont chargées dans le cache à chaque redémarrage du cache. Par conséquent, il n'y aura aucune perte de données mises en cache même après que le cluster de cache complet s'arrête pour une raison quelconque, puis redémarre.
- Fournisseur d'écriture persistante : Ce fournisseur est automatiquement appelé lorsque vous écrivez quelque chose dans le cache persistant. Il réplique ce qui est écrit dans le magasin persistant afin qu'il reste disponible lorsque le cache redémarre Il existe 2 options pour configurer ce fournisseur - Write-Thru et Write-Behind. Ceux-ci permettent à l'utilisateur d'effectuer la réplication en arrière-plan ou de répliquer avant l'opération d'écriture.
Avec Écrire-Thru, à chaque opération d'écriture, les données sont simultanément enregistrées dans le magasin persistant, puis le contrôle est rendu à l'application.
Avec Écriture derrière, NCache met l'opération en file d'attente et l'exécute en arrière-plan, renvoyant le flux à l'utilisateur avant que les opérations de base de données ne soient effectuées. - Fournisseur de lecture permanente : Ce fournisseur est appelé au cas où l'utilisateur aurait besoin de données qui ne sont pas disponibles dans le cache. Le cluster de cache qui utilise le fournisseur de lecture directe récupère ces données dans le magasin persistant et les conserve dans le cache.
Exemple rapide de fournisseur de persistance WriteThru
Examinons un exemple rapide de la façon dont vous pouvez utiliser un cache persistant avec NCache. Dans cet exemple, nous allons ajouter un élément au cache en utilisant le Fournisseur WriteThru. Lorsque l'utilisateur ajoute l'élément au cache, le fournisseur d'écriture immédiate déployé avec le serveur de cache est appelé et l'élément est simultanément enregistré dans le magasin de données persistantes. Désormais, si le cache se ferme ou si l'élément est supprimé du cache sans utiliser Write-Thru, l'élément sera supprimé du cache mais pas du magasin persistant ; les données ne seront pas perdues car elles se trouveront dans le magasin persistant. Lorsque cet élément est requis, il sera extrait du magasin persistant vers le cache.
Voici le code de base montrant l'interface du fournisseur 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; } } |
Voici comment vous pouvez insérer un élément dans le cache avec l'écriture immédiate activée afin qu'il utilise votre implémentation d'écriture immédiate déployée :
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 Détails Documents de mise en cache en écriture immédiate
Fournisseur ReadThru de persistance
Supposons que l'application veuille certaines données du cache. Ces données étaient auparavant stockées dans le cache, mais pour une raison quelconque, elles ne sont plus disponibles. Normalement, si l'utilisateur essaie d'accéder à ces données, le cache renvoie une valeur nulle car le cache ne contient pas les données requises et un code supplémentaire contenant des requêtes doit être écrit pour extraire les données de la base de données. Cela rendra la logique de l'application trop complexe. Le cache est d'abord recherché pour l'élément requis et s'il n'est pas disponible, vérifiez la base de données, puis chargez les données.
Lorsque nous utilisons le NCache magasin de données de persistance, les données supprimées du cache seraient toujours stockées dans le magasin de données persistantes et le cache appellerait le Fournisseur ReadThru mise en œuvre et les données seraient appelées dans le cache et renvoyées à l'utilisateur. Alors maintenant, vous obtiendrez les données souhaitées même si elles ont été supprimées du cache sans avoir besoin de code supplémentaire.
Voici le code de base montrant l'interface du fournisseur 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) { ... } } |
Vous pouvez extraire des données du cache avec la lecture activée. Ainsi, si elles n'existent pas dans le cache, elles seront extraites de la source de données conformément à votre implémentation du fournisseur de lecture.
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 Détails Documents de mise en cache lus
Chargeur de démarrage de persistance
Comme indiqué précédemment, un cache est volatile et toutes les données d'un cache sont effacées une fois le cache désactivé. Au redémarrage, le cache est vide et doit être rempli à nouveau. Le chargement de chaque entrée lorsqu'elle est requise à l'aide du fournisseur Read-Thru ralentit le processus d'obtention des données et des opérations. Et si nous pouvions charger toutes les données du cache au démarrage du cache ? Avec le Chargeur de cache interface fournie par NCache, toutes les données du magasin persistant sont dupliquées dans le cache au démarrage afin qu'elles soient disponibles pour l'application.
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 Détails Docs du chargeur de démarrage du cache
Supprimer les données du magasin de données persistant
Dans la solution que j'ai proposée, le magasin persistant est lié à votre cache, de sorte que toute modification apportée dans le cache serait également effectuée dans le magasin persistant. Par exemple, un élément de données est stocké dans le cache ainsi que dans un magasin persistant. Lorsque l'utilisateur le supprime du cache, il sera également supprimé du magasin persistant, avec l'aide du fournisseur d'écriture immédiate. Cela garantira que le cache principal reste synchronisé avec le magasin de données persistantes.
Cependant, ceci est complètement flexible, vous pouvez le modifier et avoir des éléments stockés dans le magasin persistant même si l'application envoie une commande de suppression.
Constat NCache?
NCache est un cache distribué en mémoire rapide et évolutif, leader sur le marché, conçu à 100 % pour .NET / .NET Core applications. Il fournit des fonctionnalités côté serveur pour prendre en charge la persistance du cache et de nombreuses configurations peuvent être faites pour utiliser la persistance du cache selon les besoins. Les données peuvent être conservées du cache vers n'importe quelle base de données de notre choix. NCache met en cache les données d'application et supprime les goulots d'étranglement de performances liés à votre stockage de données et à vos bases de données. Il vous permet de stocker vos données dans le cache pendant de plus longues périodes pour vous assurer que vos données sont disponibles lorsque vous en avez besoin. NCache le magasin de données de persistance élimine le besoin de déplacer les données de la base de données vers le cache à chaque démarrage du cache. Cela garantit la haute disponibilité de vos données sans avoir besoin d'écrire de code supplémentaire !
Rendez-vous sur NCache Documents pour en savoir plus sur la mise en œuvre et l'utilisation NCache magasin de données persistant avec votre cache distribué.