Con lo sviluppo di applicazioni distribuite ad alta transazione, le soluzioni di cache distribuita sono diventate altamente desiderabili per ottenere la scalabilità delle prestazioni. NCache è una buona scelta come archivio dati distribuito in memoria poiché fornisce scalabilità lineare ed elevata disponibilità.
Fin qui tutto bene, ma come garantire l’integrità dei dati in tali ambienti condivisi è un grosso problema. Poiché due o più client possono accedere e modificare simultaneamente gli stessi dati nell'applicazione, il risultato può essere dati incoerenti. Una volta che si verificano violazioni dell'integrità dei dati, i dati nella cache diventano praticamente inutili.
In questo post del blog, spiegherò come si verifica questo problema e come NCache ti salva con i suoi chiusura distribuita caratteristica.
NCache Dettagli NCache Blocco Ncache Docs
Problemi di integrità dei dati senza blocco
Per comprendere in dettaglio il problema dell'integrità dei dati, consideriamo l'esempio di un negozio di e-commerce online in cui i venditori caricano i loro prodotti mentre i clienti visualizzano ed effettuano ordini per l'acquisto di tali prodotti.
Supponiamo che un cliente desideri visualizzare un determinato prodotto e il venditore di quel prodotto desideri aggiornarne il prezzo. Ora, se un cliente sta visualizzando un prodotto a un prezzo più alto e il venditore aggiunge uno sconto che l'utente non può ancora vedere, l'utente finisce per acquistare il prodotto a un prezzo più alto.
Lo scenario è mostrato nella Figura 1.
- Il client 1 legge i dettagli del prodotto nella cache.
- Il cliente 2 legge anche i dati del prodotto. È corretto.
- Il client 1 ora aggiorna i dettagli del prodotto nella cache.
- Il client 2 aggiorna anche i dettagli del prodotto nella cache.
- Gli aggiornamenti effettuati dal client 1 vengono persi.
Vediamo come NCache risolve questo problema.
NCache Dettagli Blocco pessimistico Blocco ottimistico
NCache Chiusura distribuita
NCache fornisce un modo flessibile per proteggere i tuoi dati in base alle tue esigenze aziendali consentendoti di bloccare i tuoi dati. Un utente prende il controllo di un blocco di dati e lo aggiorna. Nel frattempo, nessun altro utente può manipolare quei dati.
In base allo scenario dell'applicazione, puoi scegliere uno di questi NCache meccanismi di bloccaggio:
- Blocco pessimistico (blocchi transazionali o esclusivi): blocca un elemento esclusivamente che lo rende inaccessibile ad altri utenti.
- Blocco ottimistico (blocco tramite il controllo delle versioni degli elementi): utilizza il controllo delle versioni degli elementi che rende un elemento accessibile ad altri utenti.
Blocco pessimistico per i dati sensibili
Dovresti usare il file strategia di blocco pessimistica quando i dati che richiedono aggiornamenti nella tua applicazione sono sensibili. Puoi utilizzare un LockHandle per acquisire un blocco esplicito sui tuoi dati. Una volta terminato, il blocco viene rilasciato.
Ora, vediamo che come NCache il blocco pessimistico risolve il problema della coerenza dei dati nel nostro esempio. Puoi acquisire un blocco esclusivo sul prodotto da aggiornare nel frattempo, nessun altro utente può accedere a quel prodotto. Ciò è illustrato nella figura 2.
- Il cliente 1 acquisisce il blocco del prodotto e inizia ad aggiungere e aggiornare i dettagli del prodotto.
- Al client 2 viene negato l'accesso per leggere i dettagli del prodotto e deve attendere fino al rilascio del blocco.
- Una volta sbloccato il blocco, il Cliente 2 può continuare le sue normali operazioni sul prodotto.
È importante notare che, NCache supporta due set di API: con e senza blocco. Se l'utente desidera utilizzare il blocco pessimistico, le API con parametri di blocco devono essere utilizzate ovunque nelle applicazioni in cui è richiesta una forte coerenza dei dati. Vediamo come puoi farlo con NCache funzione di blocco. Nel segmento di codice seguente, prima viene creato un nuovo LockHandle e quindi viene impostato l'intervallo di tempo per specificare il periodo di tempo per il quale verrà acquisito il blocco. Questo LockHandle funziona come un ID di blocco per identificare il blocco. Un lucchetto viene quindi acquisito utilizzando il metodo Get con una chiave e LockHandle.
Ora puoi eseguire le tue operazioni aziendali e rilasciare manualmente il blocco o attendere la fine dell'intervallo di tempo.
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); |
Qui, Ottieni API con parametri di blocco viene restituito immediatamente senza attendere l'acquisizione del blocco. Devi fare reti esplicite per acquisire un blocco sugli oggetti nel caso in cui fallisci in primo luogo.
Puoi anche acquisire un lucchetto utilizzando il metodo Lock che associa un LockHandle a una chiave. NCache fornisce vari modi per acquisire/rilasciare un blocco esplicito che consente un bloccaggio flessibile. Se intendi implementare NCache bloccaggio, utilizzando il NCache esempio di applicazione per il blocco degli elementi GitHub sarà utile.
NCache Dettagli Blocco pessimistico Blocco ottimistico
Blocco ottimistico per la disponibilità dei dati
Il blocco pessimistico è ottimo, ma potrebbe non essere un approccio ottimale quando il tempo di risposta è fondamentale per la tua applicazione. È qui che il blocco ottimistico torna utile.
NCache usi ottimistici del blocco versione degli elementi della cache per superare la fame di thread causata nel caso di blocco esplicito. Quindi, puoi lavorare su una versione dell'elemento memorizzato nella cache che viene incrementata con ogni aggiornamento di quell'elemento. NCache tiene traccia della versione dell'articolo e non devi preoccuparti della coerenza dei dati.
La figura 3 mostra come è fatto:
- Il client 1 aggiunge dettagli sul prodotto e CacheItemVersion è impostato su v1.
- Il client 2 legge i dettagli del prodotto aggiornati con CacheItemVersion v1.
- Il client 1 modifica nuovamente i dettagli a causa dei quali CacheItemVersion viene incrementato e diventa v2.
- Ora, quando il client 2 tenta di aggiornare i dettagli utilizzando la vecchia CacheItemVersion v1, l'operazione non riesce con CacheItemVersion
- Il client 2 ottiene l'ultima versione di CacheItem
- Il client 2 aggiorna i dettagli del prodotto utilizzando CacheItemVersion. Ora l'operazione viene eseguita correttamente e incrementa automaticamente CacheItemVersion di 1.
Ciò garantisce che tutti gli utenti abbiano aggiornato CacheItemVersion in ogni momento e che a nessun utente venga rifiutato l'accesso a qualsiasi prodotto nel negozio.
Il codice seguente mostra come farlo:
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 } |
Perché usare NCache Blocco
Dati sicuri e coerenti sono fondamentali per le aziende di oggi e sarebbe un peccato se qualcosa di semplice come le transazioni multiutente danneggia l'integrità dei dati.
NCache garantisce l'integrità e la coerenza dei dati in ambienti altamente distribuiti con la massima flessibilità. In base allo scenario dell'applicazione, è possibile adottare diversi meccanismi di blocco in vari modi forniti da NCache. Alla fine, avrai concorrenza senza alcuna incoerenza dei dati!
Informazioni così straordinarie che hai, da dare agli altri. Grazie per avercelo fatto sapere. Si prega di continuare a condividere tali informazioni, che garantiscono la sicurezza delle nostre proprietà.