Avec le développement d'applications distribuées à transactions élevées, les solutions de mise en cache distribuée sont devenues hautement souhaitables pour atteindre l'évolutivité des performances. NCache est un bon choix en tant que magasin de données distribué en mémoire car il fournit évolutivité linéaire ainsi que la haute disponibilité.
Jusqu’ici, tout va bien, mais garantir l’intégrité des données dans de tels environnements partagés est un gros problème. Étant donné que deux clients ou plus peuvent accéder et modifier simultanément les mêmes données dans votre application, le résultat peut être des données incohérentes. Une fois que des violations de l’intégrité des données se produisent, les données stockées dans le cache deviennent pratiquement inutiles.
Dans cet article de blog, je vais vous expliquer comment ce problème se produit et comment NCache vous sauve avec son verrouillage distribué fonction.
NCache Détails NCache Verrouillable Ncache Docs
Problèmes d'intégrité des données sans verrouillage
Pour comprendre en détail le problème de l'intégrité des données, considérons l'exemple d'une boutique de commerce électronique en ligne où les vendeurs téléchargent leurs produits pendant que les clients consultent et passent des commandes pour ces produits à acheter.
Supposons qu'un client souhaite voir un certain produit et que le vendeur de ce produit souhaite mettre à jour son prix. Désormais, si un client consulte un produit à un prix plus élevé et que le vendeur ajoute une remise que l'utilisateur ne peut pas encore voir, l'utilisateur finit par acheter le produit à un prix plus élevé.
Le scénario est illustré à la figure 1.
- Le client 1 lit les détails du produit dans le cache.
- Le client 2 lit également les données du produit. C'est correct.
- Le client 1 met désormais à jour les détails du produit dans le cache.
- Le client 2 met également à jour les détails du produit dans le cache.
- Les mises à jour effectuées par le client 1 sont perdues.
Voyons comment NCache résout ce problème.
NCache Détails Verrouillage pessimiste Verrouillage optimiste
NCache Verrouillage distribué
NCache fournit un moyen flexible de sécuriser vos données en fonction des besoins de votre entreprise en vous permettant de verrouiller vos données. Un utilisateur prend le contrôle d'un bloc de données et le met à jour. Pendant ce temps, aucun autre utilisateur ne peut manipuler ces données.
En fonction de votre scénario d'application, vous pouvez choisir l'un de ces NCache mécanismes de verrouillage :
- Verrouillage pessimiste (verrous transactionnels ou exclusifs) : verrouille un élément de manière exclusive, ce qui le rend inaccessible aux autres utilisateurs.
- Verrouillage optimiste (verrouiller la gestion des versions d'éléments) : utilise la gestion des versions d'éléments qui rend un élément accessible aux autres utilisateurs.
Verrouillage pessimiste pour les données sensibles
Vous devez utiliser le stratégie de verrouillage pessimiste lorsque les données nécessitant des mises à jour dans votre application sont sensibles. Vous pouvez utiliser un LockHandle pour acquérir un verrou explicite sur vos données. Une fois que vous avez terminé, le verrou est libéré.
Maintenant, nous voyons comment NCache le verrouillage pessimiste résout le problème de cohérence des données dans notre exemple. Vous pouvez acquérir un verrou exclusif sur le produit à mettre à jour pendant ce temps, aucun autre utilisateur ne peut accéder à ce produit. Ceci est illustré dans la figure 2.
- Le client 1 acquiert le verrouillage sur le produit et commence à ajouter et à mettre à jour les détails du produit.
- Le client 2 se voit refuser l'accès à la lecture des détails du produit et doit attendre que le verrou soit libéré.
- Une fois le verrou libéré, le client 2 peut poursuivre ses opérations habituelles sur le produit.
Il est important de noter que, NCache prend en charge deux ensembles d'API : avec et sans verrouillage. Si l'utilisateur souhaite utiliser un verrouillage pessimiste, les API avec paramètres de verrouillage doivent être utilisées partout dans les applications où une forte cohérence des données est requise. Voyons comment vous pouvez le faire avec NCache fonction de verrouillage. Dans le segment de code suivant, un nouveau LockHandle est d'abord créé, puis la durée est définie pour spécifier la période pendant laquelle le verrou sera acquis. Ce LockHandle fonctionne comme un ID de verrou pour identifier le verrou. Un verrou est ensuite acquis à l'aide de la méthode Get avec une clé et LockHandle.
Vous pouvez maintenant effectuer vos opérations commerciales et libérer manuellement le verrou ou attendre la fin de la période.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 |
// Pre-condition: Cache is already connected // Create a new lock handle to fetch an Item using locking LockHandle lockHandle = new LockHandle(); // Timespan for which lock is to be taken TimeSpan timeSpan = TimeSpan.FromSeconds(5); // Get item from the cache and lock it var result = cache.Get(key, true, timeSpan, ref lockHandle); // Verify if the item is locked successfully if (result != null) { // Item has been successfully locked } else { // Key does not exist // Item is already locked with a different LockHandle } //Unlock item in cache manually cache.Unlock(key, lockHandle); |
Ici, Get API with lock parameters revient immédiatement sans attendre l'acquisition du verrou. Vous devez faire des liens explicites pour acquérir un verrou sur les éléments au cas où vous échoueriez en premier lieu.
Vous pouvez également acquérir un verrou en utilisant la méthode Lock qui associe un LockHandle à une clé. NCache offre divers moyens de acquérir/libérer un verrou explicite qui permet un verrouillage flexible. Si vous avez l'intention de mettre en œuvre NCache verrouillage, à l'aide de la NCache exemple d'application pour le verrouillage d'élément sur GitHub sera utile.
NCache Détails Verrouillage pessimiste Verrouillage optimiste
Verrouillage optimiste pour la disponibilité des données
Le verrouillage pessimiste est excellent, mais ce n'est peut-être pas une approche optimale lorsque le temps de réponse est critique pour votre application. C'est là que le verrouillage optimiste est utile.
NCache utilisations de verrouillage optimistes gestion des versions des éléments du cache pour surmonter la famine de thread causée dans le cas d'un verrou explicite. Par conséquent, vous pouvez travailler sur une version de l'élément mis en cache qui est incrémentée à chaque mise à jour de cet élément. NCache garde une trace de la version de l'élément et vous n'avez pas à vous soucier de la cohérence des données.
La figure 3 montre comment c'est fait :
- Le client 1 ajoute des détails sur le produit et CacheItemVersion est défini sur v1.
- Le client 2 lit les détails du produit mis à jour avec CacheItemVersion v1.
- Le client 1 modifie à nouveau les détails en raison desquels CacheItemVersion est incrémenté et il devient v2.
- Désormais, lorsque le client 2 tente de mettre à jour les détails à l'aide de l'ancien CacheItemVersion v1, l'opération échoue avec CacheItemVersion
- Le client 2 obtient la dernière version de CacheItemVersion
- Le client 2 met à jour les détails du produit à l'aide de CacheItemVersion. L’opération est désormais effectuée avec succès et incrémente automatiquement CacheItemVersion de 1.
Cela garantit que tous les utilisateurs ont mis à jour CacheItemVersion à tout moment et qu'aucun utilisateur ne se voit refuser l'accès à un produit du magasin.
Le code suivant montre comment procéder :
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 |
// Specify the key of the cacheItem string key = "Product:1001"; // Initialize the cacheItemVersion CacheItemVersion version = null; // Get the cacheItem previously added in the cache with the version CacheItem cacheItem = cache.GetCacheItem(key, ref version); // If result is not null if (cacheItem != null) { // CacheItem is retrieved successfully with the version var prod = cacheItem.GetValue(); prod.Discount = 0.5; // Create a new cacheItem with updated value var updateItem = new CacheItem(prod); //Set the itemversion. This version is used to compare the // item version of the cached item updateItem.Version = version; //Insert call will fail with LockingException, if cache contains a newer version of the cache item. //In case of LockingException, we can fetch the latest cache item from cache and update it cache.Insert(key, updateItem); // If it matches, the insert is successful, otherwise it fails } |
Pourquoi utiliser NCache Verrouillable
Des données sécurisées et cohérentes sont cruciales pour les entreprises d'aujourd'hui et il serait dommage que quelque chose d'aussi simple que des transactions multi-utilisateurs porte atteinte à l'intégrité de vos données.
NCache assure l'intégrité et la cohérence de vos données dans des environnements hautement distribués avec une flexibilité maximale. En fonction de votre scénario d'application, vous pouvez adopter différents mécanismes de verrouillage de différentes manières fournies par NCache. Finalement, vous aurez la simultanéité sans aucune incohérence de données !
Ces informations étonnantes que vous avez, à donner aux autres. Merci de nous l'avoir fait savoir. Veuillez continuer à partager ces informations, qui garantissent la sécurité de nos propriétés.