Se la tua applicazione fa molto affidamento sui dati e interagisce frequentemente con un database, la memorizzazione nella cache diventa fondamentale per mitigare i costi associati. Le applicazioni online che utilizzano la memorizzazione nella cache per accelerare il recupero dei dati, l'implementazione di una solida replica e coerenza dei dati sono indispensabili.
La replica dei dati è fondamentale per creare il backup dei dati critici su più server, garantendo informazioni accurate e accessibili. Allo stesso modo, tali meccanismi di coerenza sono vitali quando si sincronizzano perfettamente queste copie distribuite, prevenendo eventuali discrepanze nel processo di richiesta. Pertanto, per garantire che l'applicazione interagisca con dati accurati e aggiornati, è necessario utilizzare queste funzionalità per backup, disponibilità elevata e coerenza dei dati.
Per fortuna, NCache fornisce un insieme affidabile di meccanismi di replica e sincronizzazione proprio per tali sistemi distribuiti. Questo blog spiega dettagliatamente come NCache soddisfa queste condizioni.
NCache topologie
Le topologie di memorizzazione nella cache supportate da NCache includono l' Topologia specchiata, Topologia replicata, Topologia delle partizioni e della replica delle partizionie Topologia della cache del client.
- Topologia speculare: Per tutte le operazioni di lettura e scrittura nella topologia Mirrored Cache, i nodi client si connettono solo al nodo server attivo del cluster. Le applicazioni client stabiliscono immediatamente una connessione con il nodo precedentemente passivo se il nodo del server attivo si interrompe.
- Topologia replicata: La topologia replicata garantisce che, in caso di guasto di più server contemporaneamente, i dati non vadano persi poiché ciascun server ha la stessa copia dei dati.
- Topologia delle partizioni: Collegando tutte le applicazioni client ai server cache, la topologia delle partizioni offre un'elevata disponibilità dei dati dividendoli in blocchi, collegando quindi tutte le applicazioni client ai server cache. In questo modo l'applicazione ottiene i dati richiesti anche nel caso in cui il server connesso non funzioni, richiedendo gli altri server.
- Topologia di replica delle partizioni: La topologia Partition-Replica non solo crea partizioni dinamiche, ma anche repliche dinamiche di queste partizioni su altri nodi del server, che fungono da backup in caso di errore di connessione o guasto del nodo. In queste situazioni, NCache ottiene i dati dal nodo di replica e li distribuisce.
- Topologia della cache del client: Nella topologia cache client, la cache risiede molto vicino all'applicazione e consente di memorizzare rapidamente nella cache i dati dalla cache distribuita.
Ulteriori informazioni sulle topologie nel blog: Ridimensionamento e mantenimento: esplorazione delle topologie in NCache.
Replica dei dati in NCache
L'obiettivo principale della replica dei dati è garantire la coerenza, la disponibilità e la tolleranza agli errori dei dati. Mantenendo copie identiche dei dati in posizioni diverse, i sistemi possono migliorare le prestazioni, ridurre la latenza e proteggersi da potenziali perdite di dati o guasti dei server.
È sincrono o asincrono, a seconda della topologia utilizzata. Nella replica sincrona, NCache garantisce che i dati vengano scritti contemporaneamente sul server cache primario e sulle relative repliche. Tuttavia, questo metodo garantisce una forte coerenza dei dati, ma le prestazioni potrebbero risentirne, poiché qualsiasi operazione di scrittura nella cache deve attendere la conferma da tutte le repliche.
In alternativa, la replica asincrona aggiorna le repliche dopo aver scritto i dati nel server cache primario. Poiché queste operazioni di scrittura nella cache non attendono la conferma della replica, questa strategia offre maggiori vantaggi in termini di prestazioni. Tuttavia, questa strategia potrebbe causare incoerenze temporanee dei dati tra le repliche e il server cache primario.
Topologie per la replica sincrona e asincrona dei dati
Ciascuna delle topologie discusse offre il proprio insieme di caratteristiche, non tutte soddisfano la replica dei dati. Ad esempio, la replica sincronizzata, impiegata in Topologia della cache con mirroring, garantisce la coerenza dei dati scrivendo simultaneamente sui nodi primario e di replica. D'altra parte, scrivendo prima sui nodi primari e aggiornando successivamente le repliche, la replica asincrona, utilizzata nel Topologia della cache replicata, migliora l'efficienza ma può occasionalmente causare errori.
Fortunatamente la documentazione dedicata a Topologia di replica delle partizioni raggiunge un equilibrio tra ridondanza, disponibilità e prestazioni combinando i vantaggi delle topologie Partitioned e Replicated Cache. Gli utenti possono selezionare la tecnica migliore in base alle loro esigenze.
Meccanismi di coerenza dei dati
La coerenza dei dati si riferisce all'affidabilità e all'accuratezza delle informazioni in un sistema o database, garantendo che i dati rimangano accurati e affidabili durante le varie operazioni. Per garantire la coerenza dei dati, NCache fornisce un meccanismo di Chiusura distribuita che consente di bloccare elementi specifici della cache durante gli aggiornamenti simultanei. Diversi utenti possono lavorare contemporaneamente su vari elementi della cache senza compromettere l'integrità dei dati applicando i blocchi. Pertanto, i blocchi della cache sono utili per gestire le risorse condivise in un ambiente distribuito.
Per mantenere la coerenza dei dati, NCache funge da gestore di blocco distribuito e fornisce due tipi di blocco: Blocco ottimistico (versioni degli elementi della cache) ed Blocco pessimistico (blocco esclusivo). Usi di blocco ottimistici Controllo delle versioni degli elementi della cache. In questo tipo di blocco, il metodo Add aggiunge un nuovo elemento nella cache e salva la versione dell'elemento per la prima volta, mentre il metodo insert sovrascrive il valore di un elemento esistente e aggiorna la relativa versione dell'elemento. L'esempio seguente crea un LockHandle e quindi blocca un elemento con la chiave Product:1001 per un intervallo di tempo di 10 secondi, in modo che l'elemento venga sbloccato automaticamente dopo 10 secondi.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
// Prerequisite: Cache is already connected // Item is already added in the cache // Specify the key of the item string key = $"Product:1001"; // Create a new LockHandle LockHandle lockHandle = null; // Specify time span of 10 seconds for which the item remains locked TimeSpan lockSpan = TimeSpan.FromSeconds(10); // Lock the item for a time span of 10 seconds bool lockAcquired = cache.Lock(key, lockSpan, out lockHandle); // Verify if the item is locked successfully if (lockAcquired == true) { // Item has been successfully locked } else { // Key does not exist // Item is already locked with a different LockHandle } |
In alternativa, il blocco pessimistico blocca l'elemento utilizzando il comando Maniglia di blocco, impedendo a tutti gli altri utenti di eseguire qualsiasi operazione di scrittura su quell'elemento della cache. Dopo aver acquisito con successo il blocco durante il recupero dell'elemento, l'applicazione può ora eseguire operazioni in sicurezza, sapendo che nessun'altra applicazione può ottenere o aggiornare questo elemento finché si dispone di questo blocco. L'esempio seguente blocca un elemento nella cache e quindi ottiene l'elemento utilizzando lockHandle. L'elemento viene quindi aggiornato e quindi reinserito nella cache utilizzando l'API Insert.
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(); // 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 Dettagli
- NCache Blocco pessimistico
- Utilizzo del blocco con i dati memorizzati nella cache Blog
Migliori pratiche per la replica e la coerenza dei dati
Ora che abbiamo appreso i meccanismi di replica e coerenza dei dati forniti da NCache, esploriamo le pratiche consigliate in questo contesto. La topologia replicata è la scelta migliore per un'applicazione che necessita di elevata disponibilità e può sopravvivere al guasto di (n-1) nodi senza alcuna perdita di dati. La topologia Partition-Replica, invece, fornisce sia un'elevata disponibilità che la capacità di soddisfare le crescenti esigenze di dati.
Sebbene non sia altamente disponibile come la topologia replicata, può comunque resistere al guasto del nodo senza alcuna perdita di dati. Ogni partizione ha un backup; quindi, ogni nodo ha essenzialmente una partizione e un backup di un'altra partizione. D'altro canto, la topologia con mirroring offre affidabilità e disponibilità dei dati attraverso la replica asincrona dal nodo attivo al nodo passivo.
NCache supporta anche strategie di invalidazione dei dati basate sul tempo per far scadere i dati della cache. Invalidazione dei dati tramite Scadenza significa che puoi specificare la durata di tempo durante la quale i dati rimangono nella cache, dopodiché scadono. In questo modo, la tua cache avrà i dati aggiornati alla successiva richiesta del client, eliminando quindi i dati obsoleti, garantendo la coerenza dei dati. Invalidazione tramite dipendenze garantisce che i dati della cache vengano rimossi ogni volta che si verificano modifiche nel database.
Conclusione
La replica e la coerenza dei dati sono la spina dorsale di un'applicazione affidabile e ad alte prestazioni. Fortunatamente, con NCache, hai accesso a funzionalità affidabili che ti consentono di creare applicazioni altamente scalabili e con tolleranza agli errori in grado di gestire anche le esigenze di dati più complesse.