Gestione dei blocchi di sistema distribuiti con Azure Storage

I sistemi distribuiti esistono da un po’ di tempo e ci sono già modelli ben noti stabiliti quando si progettano. Oggi discuteremo di uno dei modelli più popolari: “blocchi.”

In termini semplici, i blocchi sono il modo in cui i processi ottengono accesso esclusivo a una risorsa per eseguire una determinata azione. Ad esempio, immagina che ci siano un certo numero di Blobs in un account di archiviazione e hai bisogno che un’istanza del tuo servizio elabori ogni blob per evitare elaborazioni duplicate. Il modo per farlo sarebbe acquisire un blocco sul blob, completare l’elaborazione e rilasciarlo. Tuttavia, sorge un problema potenziale se un processo fallisce prima di rilasciare il blocco, sia perché il processo è morto sia a causa di una partizione di rete, lasciando la risorsa bloccata indefinitamente. Questo può portare a situazioni di stallo e contesa delle risorse.

Per prevenire i deadlock, una strategia che può essere impiegata è utilizzare timeout o blocchi basati su leasing.

Blocco Timeout

  • In questo caso, c’è un timeout predefinito per il quale il processo richiede il blocco. Se il blocco non viene rilasciato prima della scadenza, il sistema garantisce che il blocco venga eventualmente rilasciato.

Blocco di Leasing

  • Per i lucchetti basati su affitto, è fornita un’API di rinnovo dell’affitto insieme al meccanismo di timeout. Il processo che detiene il lucchetto deve chiamare questa API prima che l’affitto scada per mantenere l’accesso esclusivo alla risorsa. Se il processo non riesce a rinnovare l’affitto in tempo, il lucchetto viene automaticamente rilasciato, consentendo ad altri processi di acquisirlo.

Pro e contro dei lucchetti basati su timeout e affitto

Pros Cons
Lucchetto basato su timeout Facile da implementare Richiede una selezione attenta del timeout
Previene lucchetti permanenti Se l’elaborazione non è completa, non c’è modo di rinnovare l’affitto
Lucchetto basato su affitto Riduce il rischio di scadenza prematura
del lucchetto
Richiede un meccanismo per il rinnovo dell’affitto

Il processo può continuare a richiedere l’affitto fino al completamento del lavoro.

Entrambe le strategie sopra sono un modo per recuperare rapidamente da guasti di processo o partizioni di rete in sistemi distribuiti.

Strategia di Blocco del Contratto con Azure Storage

Vediamo come utilizzare la strategia di Blocco del Contratto con Azure Storage. Questo copre anche la strategia di blocco Timeout.

Passo 1: Importa il Nuget di Storage Blob

“12.23.0” è l’ultima versione al momento della redazione di questo articolo. Le versioni più recenti possono essere trovate su Azure Storage Blobs.

XML

 

Passo 2: Acquisire il Contratto

Sotto è riportato il codice per acquisire il contratto.

C#

 

  1. Per prima cosa, creiamo un Blob Container Client e recuperiamo il Blob Client per il blob specifico su cui vogliamo acquisire un contratto.
  2. In secondo luogo, il metodo “Acquire Async” tenta di acquisire il contratto per una durata specifica. Se l’acquisizione ha avuto successo, viene restituito un Id del contratto, altrimenti viene generato un 409 (codice di stato per conflitto).
  3. Il “Acquire Async” è il metodo chiave qui. Il resto del codice può essere personalizzato/modificato in base alle tue esigenze.

Passo 3: Rinnova il Contratto

  • “Renew Async” è il metodo nel SDK .NET di Storage utilizzato per rinnovare il contratto.
  • Se il rinnovo non ha successo, viene generata un’eccezione insieme al motivo della causa del fallimento.
C#

 

Passo 4: Orchestrare i Metodi di Acquisizione e Rinnovo del Contratto

  • Inizialmente, chiamiamo “Try Acquire Lease Async” per recuperare l’identificatore del contratto dal Passaggio 2. Una volta che è riuscito, viene avviato un compito in background che chiama “Renew Lease Async” dal Passaggio 3 ogni X secondi. Assicurati solo che ci sia abbastanza tempo tra il timeout e quando viene chiamato il metodo di rinnovo del contratto.
C#

 

  • Il token di cancellazione viene utilizzato per interrompere delicatamente il compito di rinnovo del contratto quando non è più necessario.

Passaggio 5: Annulla il Rinnovo del Contratto

  • Quando viene chiamato il metodo “Cancel Async”, l'”IsCancellationRequested” nel Passaggio 4 diventa vero, a causa del quale non entriamo più nel ciclo while e non richiediamo il rinnovo del contratto.
C#

 

Passaggio 6: Rilascia il Contratto

Infine, per rilasciare il contratto basta chiamare il metodo “Release Async”.

C#

 

Conclusione

Le serrature sono tra i modelli fondamentali nei sistemi distribuiti per ottenere l’accesso esclusivo alle risorse. È necessario tenere a mente le insidie durante il loro utilizzo per il corretto funzionamento delle operazioni. Utilizzando Azure Storage, possiamo implementare questi efficienti meccanismi di blocco che possono prevenire il blocco indefinito e, allo stesso tempo, fornire elasticità su come vengono gestite le serrature.

Source:
https://dzone.com/articles/locks-in-distributed-systems-timeout-lease-based