Si votre application dépend fortement d'une base de données, la mise en cache est essentielle pour surmonter les problèmes associés aux bases de données, en particulier dans les scénarios à fort trafic. Pour les applications en ligne qui utilisent la mise en cache pour accélérer la récupération des données, la mise en œuvre d'une réplication de données robuste est essentielle pour maintenir la cohérence et la disponibilité.
La réplication des données est essentielle pour créer des sauvegardes des données de cache essentielles sur plusieurs serveurs, préserver l'intégrité des données et garantir une haute disponibilité. De même, ces mécanismes de synchronisation sont essentiels pour éviter toute divergence dans les processus d'application. Par conséquent, vous devez faire de votre mieux pour créer une stratégie de réplication des données complète. Heureusement, NCache réalise l’importance de tels mécanismes de réplication et de synchronisation et offre aux utilisateurs une variété d’options parmi lesquelles choisir, comme détaillé dans le blog ci-dessous.
Principaux plats à emporter:
Réplication des données : NCache assure une réplication synchrone et asynchrone pour garantir la disponibilité des données et la tolérance aux pannes sur plusieurs nœuds de serveur.
Variété de topologies : Les utilisateurs peuvent choisir entre Mirror (actif-passif), Replicated (copies complètes sur tous les nœuds) ou Partition-Replica (partitions évolutives avec sauvegardes) pour équilibrer les performances et la redondance.
Contrôle de cohérence : L'intégrité des données est rigoureusement maintenue grâce à un verrouillage distribué, offrant un verrouillage optimiste via le versionnage des éléments et un verrouillage pessimiste pour un accès exclusif aux éléments.
Stratégies d'invalidation : La cohérence est encore renforcée par l'utilisation d'expirations temporelles et de dépendances de base de données afin d'éliminer les données obsolètes et de garantir que le cache corresponde à la source de données principale.
NCache Topologies
Plusieurs topologies de mise en cache prises en charge par NCache (les Miroir, Répliqué et Topologie de réplication de partition, qui sont expliqués ci-dessous) soulignent cette capacité.
| topologie | réplication | Avantage principal | Tolérance aux pannes |
|---|---|---|---|
| Miroir | Mesures synchrones | Haute disponibilité (actif-passif) | Défaillance d'un nœud (basculement automatique) |
| Répliqué | asynchrones | Évolutivité de lecture maximale | Plusieurs nœuds (redondance complète des données) |
| Réplique de partition | Synchrone / Asynchrone | Évolutivité avec redondance | Configurable (en fonction du nombre de répliques) |
- Topologie miroir : Dans une topologie en miroir, un cluster de cache comporte deux nœuds. Un seul est actif à la fois, l'autre faisant office de nœud passif. Concrètement, pour toutes les opérations de lecture et d'écriture, les nœuds clients se connectent uniquement au nœud serveur actif du cluster. En cas de défaillance de ce dernier, le nœud passif prend automatiquement le relais, garantissant ainsi une haute disponibilité sans interruption.
- Topologie répliquée : Cette topologie réplique les données du cache sur tous les nœuds de serveur du cluster. Chaque nœud contient une copie complète du cache, donc même si plusieurs nœuds échouent, aucune donnée n'est perdue.
- Topologie de partition-réplique : La topologie de partition-réplique crée non seulement des partitions dynamiques disponibles dans la topologie partitionnée pour l'évolutivité. Elle crée également des répliques dynamiques de ces partitions sur d'autres nœuds de serveur, qui agissent comme une sauvegarde en cas d'échec de connexion ou de défaillance de nœud. Dans ces situations, NCache obtient les données de cache du nœud de réplication et les distribue selon les besoins.
Apprenez-en plus sur les topologies dans le blog : Mise à l'échelle et maintien : exploration des topologies dans NCache.
Réplication des données dans NCache
L'objectif principal de la réplication des données est de garantir la disponibilité, la cohérence et la tolérance aux pannes des données. En conservant des copies identiques des données à différents emplacements, les systèmes peuvent améliorer les performances et réduire la latence, tout en se protégeant contre les pertes de données potentielles ou les pannes de serveur. La réplication des données est soit synchrone, soit asynchrone, selon la topologie utilisée, comme indiqué ci-dessous.
- Réplication synchrone : Avec la réplication synchrone, NCache Cette méthode garantit l'écriture simultanée des données sur le serveur de cache principal et ses répliques. Toutefois, bien qu'elle soit recommandée pour les scénarios exigeant une haute disponibilité, les performances de votre application peuvent être affectées, car toute opération d'écriture dans le cache doit attendre la confirmation de toutes les répliques.
- Réplication asynchrone : Alternativement, la réplication asynchrone met à jour les répliques après l'écriture des données sur le serveur de cache principal. Cette méthode améliore les performances en permettant d'effectuer des opérations d'écriture sans attendre la confirmation de la réplique. Cependant, cette stratégie peut entraîner des incohérences de données temporaires entre les répliques et le serveur de cache principal.
Topologies pour la réplication de données synchrone et asynchrone
Chacune des topologies présentées offre son propre ensemble de caractéristiques, mais toutes ne sont pas adaptées à la réplication des données. Par exemple, la réplication synchronisée, utilisée dans le Topologie de cache en miroir, garantit la cohérence des données en écrivant simultanément sur les nœuds principal et réplica. D'un autre côté, en écrivant d'abord sur les nœuds principaux et en mettant à jour les réplicas ultérieurement, la réplication asynchrone, utilisée dans le Topologie du cache répliqué, améliore l'efficacité mais peut parfois entraîner des erreurs. Cependant, la réplication présente des problèmes, par exemple, lorsque la taille des données augmente de manière exponentielle, il devient nécessaire de partitionner vos données.
Heureusement, le Topologie de réplication de partition établit un équilibre entre disponibilité, redondance et performances en combinant les avantages des topologies de cache partitionné et répliqué. Vous pouvez sélectionner la technique qui vous convient le mieux en fonction de vos besoins.
Mécanismes de cohérence des données
NCache permet aux développeurs d'ajuster l'équilibre entre cohérence et disponibilité, en fonction des différentes exigences du théorème CAP et de la topologie et du mode de réplication choisis. La cohérence des données désigne la fiabilité et l'exactitude des informations à travers la pile applicative, quelles que soient les opérations des utilisateurs. Pour garantir la cohérence des données, NCache fournit une Verrouillage distribué Mécanisme permettant de verrouiller des éléments de cache spécifiques lors des mises à jour. Ainsi, plusieurs utilisateurs peuvent travailler simultanément sur différents éléments de cache sans compromettre l'intégrité de leurs données en appliquant des verrous au niveau des composants. Par conséquent, les verrous de cache sont utiles pour gérer les ressources partagées dans un environnement distribué.
NCache vous propose deux types de verrouillage : Verrouillage optimiste (versions d'éléments de cache) et Verrouillage pessimiste (verrouillage exclusif). Le verrouillage optimiste utilise le contrôle de version des éléments du cache. Dans ce type de verrouillage, le Ajouter La méthode ajoute un nouvel élément dans le cache et enregistre la version de l'élément pour la première fois, tandis que la insérer La méthode écrase la valeur d'un élément existant et met à jour sa version d'élément.
L'exemple suivant crée un Poignée de verrouillage et verrouille ensuite un élément avec la clé Produit:1001 et la version de l'élément.
|
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
// An item is added in the cache with itemVersion // 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 and version is valid if (cacheItem != null && version != null) { // CacheItem is retrieved successfully with the version // If result is of type Product var prod = cacheItem.GetValue<Product>(); prod.UnitsInStock++; else { // Item could not be retrieved; it might not exist or the version is outdated Console.WriteLine("Cache item could not be retrieved or version is invalid."); } |
Alternativement, le verrouillage pessimiste verrouille l'élément à l'aide du descripteur de verrouillage, empêchant tous les autres utilisateurs d'effectuer une opération d'écriture sur cet élément de cache. Une fois le verrou acquis avec succès lors de la récupération de l'élément, l'application peut désormais effectuer des opérations en toute sécurité sur cet élément, sachant qu'aucune autre application ne peut y accéder ou le modifier jusqu'à ce que le verrou soit libéré. L'exemple suivant verrouille un élément dans le cache, puis récupère l'élément à l'aide du descripteur de verrouillage. L'élément est ensuite mis à jour, puis réinséré dans le cache à l'aide de l'API d'insertion.
|
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 |
// Specify the key of the item string key = $"Product:1001"; // Set acquireLock flag as true bool acquireLock = true; // Specify time span of 10 seconds for which the item remains locked TimeSpan lockSpan = new TimeSpan(0, 0, 10); // Initialize the lockHandle LockHandle lockHandle = null; CacheItem item = cache.GetCacheItem(key, acquireLock, lockSpan, ref lockHandle); var product = new Product(); product = item.GetValue<Product>(); // Update the unitsinstock for the product product.UnitsInStock = 200; bool releaseLock = true; // Item is already locked with a LockHandle // Update the item and release the lock as well since releaseLock is set true // Make sure that the LockHandle matches with the already added LockHandle cache.Insert(key, item, null, lockHandle, releaseLock); |
- NCache DÉTAILS
- Verrouillage pessimiste
- Utilisation du verrouillage avec les données mises en cache Blog
Mécanismes supplémentaires pour la réplication et la cohérence des données
Maintenant que nous avons découvert les mécanismes de réplication et de cohérence des données fournis par NCache, explorons d'autres stratégies que vous pouvez utiliser pour la cohérence et la réplication des données. Par exemple, NCache prend en charge les stratégies d'invalidation des données basées sur le temps pour faire expirer les données du cache. Invalidation des données via Expiration signifie que vous pouvez définir une durée spécifique pendant laquelle les données restent dans le cache, après quoi elles expirent. De cette façon, votre cache disposera de données fraîches lors de la prochaine requête client, éliminant ainsi les données obsolètes et garantissant la cohérence des données. De plus, l'invalidation via Dépendances garantit que les données du cache sont supprimées chaque fois que des modifications se produisent dans la base de données.
Conclusion
La réplication et la cohérence des données sont la base d'une application fiable et performante. Heureusement, avec NCache, vous avez accès à des fonctionnalités robustes qui vous permettent de créer des applications hautement évolutives et tolérantes aux pannes, capables de gérer les besoins de données les plus complexes. Pourquoi attendre ? Télécharger NCache aujourd'hui et faites passer les performances de votre application au niveau supérieur !
Questions fréquentes
Q : Comment la topologie Mirror gère-t-elle les connexions client en cas de panne d'un nœud ?
A : Dans une topologie en miroir, les clients se connectent uniquement au nœud serveur actif pour les opérations de lecture et d'écriture. Si le nœud actif tombe en panne, le nœud passif prend automatiquement le relais. NCache redirige les connexions client pour garantir une disponibilité continue.
Q : Quel est le compromis en termes de performances lorsqu'on choisit la réplication synchrone plutôt que la réplication asynchrone ?
A : La réplication synchrone garantit l'écriture simultanée des données sur toutes les répliques avant confirmation, ce qui assure une cohérence maximale mais augmente la latence. La réplication asynchrone permet aux opérations d'écriture de s'achever dès la mise à jour du nœud principal, améliorant ainsi les performances au risque d'une incohérence temporaire des données pendant la mise à jour en arrière-plan.
Q : Quand un développeur doit-il choisir le verrouillage optimiste (gestion des versions d'éléments) plutôt que le verrouillage pessimiste ?
A : Le verrouillage optimiste est idéal pour les environnements à forte concurrence où les conflits de données sont rares, car il permet aux utilisateurs de modifier des éléments sans bloquer les autres. Il utilise le versionnage des éléments pour détecter si une modification est survenue depuis la récupération de l'élément. Le verrouillage pessimiste est plus adapté aux sections de données critiques où un accès exclusif absolu est requis afin d'empêcher toute modification simultanée.
Q : Comment les dépendances du cache contribuent-elles à la cohérence des données ?
A : Les dépendances du cache assurent la synchronisation entre le cache et la source de données principale. En liant les éléments mis en cache à la base de données, NCache invalide ou supprime automatiquement les données dès qu'une modification est détectée dans la base de données, empêchant ainsi l'application de consommer des informations obsolètes.






