Mit der Entwicklung verteilter Anwendungen mit hoher Transaktionsdichte sind verteilte Caching-Lösungen sehr wünschenswert geworden, um eine Leistungsskalierbarkeit zu erreichen. NCache ist eine gute Wahl als verteilter In-Memory-Datenspeicher, da er Folgendes bietet lineare Skalierbarkeit machen hohe Verfügbarkeit.
So weit, so gut, aber die Frage, wie die Datenintegrität in solchen gemeinsam genutzten Umgebungen sichergestellt werden kann, ist eine große Sache. Da in Ihrer Anwendung zwei oder mehr Clients gleichzeitig auf dieselben Daten zugreifen und diese ändern können, kann dies zu inkonsistenten Daten führen. Sobald Datenintegritätsverletzungen auftreten, werden die Daten im Cache praktisch unbrauchbar.
In diesem Blogbeitrag erkläre ich, wie dieses Problem auftritt und wie NCache rettet Sie mit seinem verteiltes Sperren -Funktion
NCache Details NCache Sperrung Ncache Docs
Datenintegritätsprobleme ohne Sperrung
Um das Problem der Datenintegrität im Detail zu verstehen, betrachten wir das Beispiel eines Online-E-Commerce-Shops, in dem Verkäufer ihre Produkte hochladen, während Kunden diese Produkte ansehen und Bestellungen zum Kauf aufgeben.
Angenommen, ein Kunde möchte ein bestimmtes Produkt ansehen und der Verkäufer dieses Produkts möchte seinen Preis aktualisieren. Wenn sich nun ein Kunde ein Produkt zu einem höheren Preis ansieht und der Verkäufer einen Rabatt hinzufügt, den der Benutzer noch nicht sehen kann, kauft der Benutzer das Produkt letztendlich zu einem höheren Preis.
Das Szenario ist in Abbildung 1 dargestellt.
- Client 1 liest die Details des Produkts im Cache.
- Client 2 liest auch die Produktdaten. Das ist richtig.
- Client 1 aktualisiert jetzt die Produktdetails im Cache.
- Client 2 aktualisiert auch die Produktdetails im Cache.
- Von Client 1 vorgenommene Aktualisierungen gehen verloren.
Mal sehen wie NCache löst dieses Problem.
NCache Details Pessimistisches Sperren Optimistische Verriegelung
NCache Verteiltes Sperren
NCache bietet eine flexible Möglichkeit, Ihre Daten entsprechend Ihren Geschäftsanforderungen zu schützen, indem Sie Ihre Daten sperren können. Ein Benutzer übernimmt die Kontrolle über einen Datenblock und aktualisiert ihn. In der Zwischenzeit kann kein anderer Benutzer diese Daten manipulieren.
Basierend auf Ihrem Anwendungsszenario können Sie eines davon wählen NCache Schließmechanismen:
- Pessimistisches Sperren (Transaktionale oder exklusive Sperren): Sperrt ein Element exklusiv, sodass es für andere Benutzer nicht zugänglich ist.
- Optimistische Verriegelung (Sperre durch Elementversionierung): Verwendet die Elementversionierung, die ein Element für andere Benutzer zugänglich macht.
Pessimistische Sperrung für sensible Daten
Sie sollten die verwenden pessimistische Sperrstrategie wenn die Daten, die in Ihrer Anwendung aktualisiert werden müssen, vertraulich sind. Sie können ein LockHandle verwenden, um eine explizite Sperre für Ihre Daten zu erhalten. Sobald Sie fertig sind, wird die Sperre aufgehoben.
Jetzt sehen wir, wie das geht NCache Das pessimistische Sperren löst in unserem Beispiel das Datenkonsistenzproblem. Sie können eine exklusive Sperre für das zu aktualisierende Produkt erwerben, während kein anderer Benutzer auf das Produkt zugreifen kann. Dies ist in Abbildung 2 dargestellt.
- Kunde 1 erhält die Sperre für das Produkt und beginnt mit dem Hinzufügen und Aktualisieren der Produktdetails.
- Client 2 wird der Zugriff zum Lesen von Produktdetails verweigert und er muss warten, bis die Sperre aufgehoben wird.
- Sobald die Sperre aufgehoben wird, kann Client 2 seine regulären Vorgänge am Produkt fortsetzen.
Es ist wichtig sich das zu merken, NCache unterstützt zwei Sätze von APIs: mit und ohne Sperre. Wenn der Benutzer pessimistisches Sperren verwenden möchte, sollten APIs mit Sperrparametern überall dort verwendet werden, wo eine starke Datenkonsistenz erforderlich ist. Mal sehen, wie Sie es damit machen können NCache Sperrfunktion. Im folgenden Codesegment wird zunächst ein neues LockHandle erstellt und dann die Zeitspanne festgelegt, um den Zeitraum anzugeben, für den die Sperre erworben wird. Dieses LockHandle dient als Sperr-ID zur Identifizierung der Sperre. Anschließend wird mithilfe der Get-Methode mit einem Schlüssel und LockHandle eine Sperre erworben.
Jetzt können Sie Ihre Geschäftsvorgänge ausführen und die Sperre manuell aufheben oder auf das Ende der Zeitspanne warten.
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); |
Hier kehrt „API mit Sperrparametern abrufen“ sofort zurück, ohne auf den Erwerb der Sperre warten zu müssen. Sie müssen explizite Wiederholungen durchführen, um eine Sperre für Elemente zu erhalten, für den Fall, dass Sie überhaupt scheitern.
Sie können eine Sperre auch mit der Lock-Methode erwerben, die ein LockHandle einem Schlüssel zuordnet. NCache bietet verschiedene Möglichkeiten dazu eine explizite Sperre erwerben/freigeben was eine flexible Verriegelung ermöglicht. Wenn Sie beabsichtigen, umzusetzen NCache Verriegelung, mit der NCache Beispielanwendung für die Artikelverriegelung GitHub wird hilfreich sein
NCache Details Pessimistisches Sperren Optimistische Verriegelung
Optimistische Sperre für Datenverfügbarkeit
Pessimistisches Sperren ist großartig, aber möglicherweise kein optimaler Ansatz, wenn die Reaktionszeit für Ihre Anwendung von entscheidender Bedeutung ist. Hier bietet sich das optimistische Sperren an.
NCache optimistische Sperranwendungen Versionierung von Cache-Elementen um den Thread-Hunger zu überwinden, der im Falle einer expliziten Sperre verursacht wird. Daher können Sie an einer Version des zwischengespeicherten Elements arbeiten, die bei jeder Aktualisierung dieses Elements erhöht wird. NCache behält den Überblick über die Artikelversion und Sie müssen sich keine Gedanken über die Datenkonsistenz machen.
Abbildung 3 zeigt, wie es gemacht wird:
- Client 1 fügt Details zum Produkt hinzu und die CacheItemVersion wird auf v1 gesetzt.
- Client 2 liest aktualisierte Produktdetails mit CacheItemVersion v1.
- Client 1 ändert erneut die Details, wodurch CacheItemVersion inkrementiert wird und zu v2 wird.
- Wenn Client 2 nun versucht, Details mit der alten CacheItemVersion v1 zu aktualisieren, schlägt der Vorgang mit CacheItemVersion fehl
- Client 2 erhält die neueste CacheItemVersion
- Client 2 aktualisiert die Produktdetails mithilfe von CacheItemVersion. Jetzt wird der Vorgang erfolgreich ausgeführt und die CacheItemVersion wird automatisch um 1 erhöht.
Dadurch wird sichergestellt, dass alle Benutzer jederzeit über die aktualisierte CacheItemVersion verfügen und keinem Benutzer der Zugriff auf ein Produkt im Shop verweigert wird.
Der folgende Code zeigt, wie es geht:
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 } |
Warum verwenden NCache Sperrung
Sichere und konsistente Daten sind für heutige Unternehmen von entscheidender Bedeutung und es wäre eine Schande, wenn etwas so Einfaches wie Mehrbenutzertransaktionen Ihre Datenintegrität beeinträchtigen würde.
NCache stellt die Integrität und Konsistenz Ihrer Daten in stark verteilten Umgebungen mit höchster Flexibilität sicher. Basierend auf Ihrem Anwendungsszenario können Sie verschiedene Verriegelungsmechanismen auf verschiedene Arten übernehmen, die von bereitgestellt werden NCache. Irgendwann haben Sie Parallelität ohne Dateninkonsistenz!
Was für erstaunliche Informationen Sie haben, um sie anderen weiterzugeben. Vielen Dank, dass Sie uns darüber informiert haben. Bitte geben Sie diese Informationen weiterhin weiter, um die Sicherheit unserer Immobilien zu gewährleisten.