Beheer van Verspreide Systeemvergrendelingen Met Azure Storage

Gedistrubeerde systemen bestaan al een tijdje en er zijn al goed bekende patronen vastgesteld bij het ontwerpen ervan. Vandaag zullen we een van de populaire patronen bespreken: “sloten.”

Simpele gezegd, sloten zijn de manier waarop processen exclusieve toegang krijgen tot een bron om een bepaalde actie uit te voeren. Stel je voor dat er een aantal Blobs in een opslagaccount zijn, en je hebt één instantie van je service nodig om elke blob te verwerken om dubbele verwerking te voorkomen. De manier om dit te doen zou zijn om een slot op de blob te verkrijgen, de verwerking te voltooien en het vervolgens weer vrij te geven. Echter, een potentieel probleem doet zich voor als een proces faalt voordat het het slot vrijgeeft, hetzij omdat het proces is gestopt of door een netwerkpartitionering, waardoor de bron onbepaald vergrendeld blijft. Dit kan leiden tot deadlocks en concurrentie voor bronnen.

Om deadlocks te voorkomen, kan een strategie die kan worden toegepast zijn het gebruik van time-outs of lease-gebaseerde sloten.

Time-out Slot

  • In dit geval is er een vooraf gedefinieerde time-out waarvoor het proces het slot aanvraagt. Als het slot niet wordt vrijgegeven vóór de time-out, zorgt het systeem ervoor dat het slot uiteindelijk wordt vrijgegeven.

Lease Slot

  • Voor lease-gebaseerde sloten is er een renew lease API beschikbaar naast het time-outmechanisme. Het proces dat het slot vasthoudt, moet deze API aanroepen voordat de lease verloopt om exclusieve toegang tot de bron te behouden. Als het proces er niet in slaagt om de lease op tijd te vernieuwen, wordt het slot automatisch vrijgegeven, waardoor andere processen het kunnen verwerven.

Voor- en nadelen van time-out en lease-gebaseerde sloten

Pros Cons
Time-out gebaseerd slot Eenvoudig te implementeren Vereist zorgvuldige selectie van de time-out
Voorkomt permanente sloten Als de verwerking niet voltooid is, is er geen manier om de lease te vernieuwen
Lease-gebaseerd slot Vermindert het risico van voortijdige
slotverval
Vereist een mechanisme voor leasevernieuwing

Het proces kan blijven vragen om de lease totdat het werk is voltooid.

Beide bovenstaande strategieën zijn een manier om snel te herstellen van procesfouten of netwerkpartitionering in gedistribueerde systemen.

Lease Lock Strategie Met Azure Opslag

Laten we kijken naar hoe we de Lease Lock strategie kunnen gebruiken met Azure Opslag. Dit omvat ook de Timeout lock strategie.

Stap 1: Importeer de Storage Blob Nuget

“12.23.0” is de nieuwste versie op het moment van het schrijven van dit artikel. De nieuwste versies zijn te vinden op Azure Storage Blobs.

XML

 

Stap 2: Verkrijg de Lease

Hieronder staat de code om de lease te verkrijgen.

C#

 

  1. Eerst creëren we een Blob Container Client en halen we de Blob Client op voor de specifieke blob waarvoor we een lease willen verkrijgen.
  2. Tweede, de “Acquire Async” methode probeert de lease voor een specifieke duur te verkrijgen. Als de verkrijging succesvol was, wordt een lease Id geretourneerd, anders wordt een 409 (statuscode voor conflict) gegooid.
  3. De “Acquire Async” is de sleutel methode hier. De rest van de code kan worden aangepast/bewerkt naar uw behoeften.

Stap 3: Verleng de Lease

  • “Renew Async” is de methode in de Storage .NET SDK die gebruikt wordt voor het verlengen van de lease.
  • Als de verlenging niet succesvol is, wordt er een uitzondering gegooid met de reden voor de oorzaak van de mislukking.
C#

 

Stap 4: Orkestreer de Acquire en Renew Lease Methoden

  • In eerste instantie roepen we de “Probeer Lease Async” aan om de lease-identificator op te halen van Stap 2. Zodra dit succesvol is, wordt er een achtergrondtaak gestart die elke X seconden de “Hervernieuw Lease Async” van Stap 3 aanroept. Zorg ervoor dat er voldoende tijd is tussen de time-out en wanneer de methode voor het vernieuwen van de lease wordt aangeroepen.
C#

 

  • De annulerings-token wordt gebruikt om de taak voor het vernieuwen van de lease op een nette manier te stoppen wanneer deze niet langer nodig is.

Stap 5: Annuleer de Lease-vernieuwing

  • Wanneer de “Annuleer Async” methode wordt aangeroepen, wordt “IsCancellationRequested” in Stap 4 waar, waardoor we de while-lus niet meer ingaan en geen verzoek om leasevernieuwing indienen.
C#

 

Stap 6: Geef de Lease vrij

Tot slot, om de lease vrij te geven, roept u gewoon de “Vrijgeven Async” methode aan.

C#

 

Conclusie

Vergrendelingen behoren tot de fundamentele patronen in gedistribueerde systemen om exclusieve toegang tot middelen te verkrijgen. Het is noodzakelijk om de valkuilen in gedachten te houden bij het omgaan met hen voor een soepele werking. Door gebruik te maken van Azure Storage, kunnen we deze efficiënte vergrendelmechanismen implementeren die onbepaalde blokkering kunnen voorkomen en tegelijkertijd elasticiteit bieden in hoe de vergrendelingen worden onderhouden.

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