Gestion des verrous du système distribué avec le stockage Azure

Les systèmes distribués existent depuis un certain temps et des modèles bien connus ont déjà été établis lors de leur conception. Aujourd’hui, nous allons discuter de l’un des modèles populaires : les « verrous. »

En termes simples, les verrous sont la manière dont les processus obtiennent un accès exclusif à une ressource pour effectuer une certaine action. Par exemple, imaginez qu’il y a un certain nombre de Blobs dans un compte de stockage, et vous avez besoin qu’une instance de votre service traite chaque blob pour éviter un traitement en double. La façon de procéder serait d’acquérir un verrou sur le blob, de terminer le traitement et de le libérer. Cependant, un problème potentiel survient si un processus échoue avant de libérer le verrou, soit parce que le processus est tombé en panne ou en raison d’une partition réseau, laissant la ressource verrouillée indéfiniment. Cela peut entraîner des blocages et une contention des ressources.

Pour prévenir les blocages, une stratégie qui peut être employée est d’utiliser des délais d’attente ou des verrous basés sur des baux.

Verrou de délai

  • Dans ce cas, il y a un délai prédéfini pour lequel le processus demande le verrou. Si le verrou n’est pas libéré avant l’expiration du délai, le système s’assure que le verrou est finalement libéré.

Verrou de bail

  • Pour les verrous basés sur la location, une API de renouvellement de bail est fournie aux côtés du mécanisme de temporisation. Le processus détenteur du verrou doit appeler cette API avant l’expiration du bail pour maintenir un accès exclusif à la ressource. Si le processus échoue à renouveler le bail à temps, le verrou est automatiquement libéré, permettant à d’autres processus de l’acquérir.

Avantages et Inconvénients des Verrous Basés sur le Timeout et les Baux

Pros Cons
Verrou basé sur le timeout Simple à mettre en œuvre Exige une sélection minutieuse du timeout
Empêche les verrous permanents Si le traitement n’est pas complet, alors il n’y a aucun moyen de renouveler le bail
Verrou basé sur le bail Réduit le risque d’expiration prématurée du verrou Exige un mécanisme de renouvellement du bail

Le processus peut continuer à demander le bail jusqu’à ce que le travail soit terminé.

Les deux stratégies ci-dessus sont un moyen de récupérer rapidement des défaillances de processus ou des partitions réseau dans les systèmes distribués.

Stratégie de verrouillage de bail avec Azure Storage

Examinons comment utiliser la stratégie de verrouillage de bail avec Azure Storage. Cela couvre également la stratégie de verrouillage de délai d’expiration.

Étape 1 : Importer le package Nuget Blob de stockage

« 12.23.0 » est la dernière version au moment de la rédaction de cet article. Les dernières versions peuvent être trouvées sur Blobs de stockage Azure.

XML

 

Étape 2: Acquérir le bail

Voici le code pour acquérir le bail.

C#

 

  1. Tout d’abord, nous créons un Client de conteneur Blob et récupérons le Client Blob pour le blob spécifique sur lequel nous voulons acquérir un bail.
  2. Ensuite, la méthode « Acquire Async » tente d’acquérir le bail pour une durée spécifique. Si l’acquisition a réussi, un ID de bail est retourné, sinon un 409 (code d’état pour conflit) est renvoyé.
  3. La méthode « Acquire Async » est la méthode clé ici. Le reste du code peut être adapté/modifié selon vos besoins.

Étape 3: Renouveler le bail

  • « Renew Async » est la méthode dans le SDK .NET de stockage utilisée pour renouveler le bail.
  • Si le renouvellement échoue, une exception est levée avec la raison de l’échec.
C#

 

Étape 4 : Orchestrer les méthodes Acquérir et Renouveler le Bail

  • Initialement, nous appelons « Try Acquire Lease Async » pour récupérer l’identifiant du bail à l’étape 2. Une fois que c’est réussi, une tâche en arrière-plan est lancée pour appeler « Renew Lease Async » à l’étape 3 toutes les X secondes. Assurez-vous simplement qu’il y a assez de temps entre le délai d’expiration et l’appel de la méthode de renouvellement du bail.
C#

 

  • Le jeton d’annulation est utilisé pour arrêter gracieusement la tâche de renouvellement du bail lorsqu’elle n’est plus nécessaire.

Étape 5: Annuler le renouvellement du bail

  • Lorsque la méthode « Cancel Async » est appelée, le « IsCancellationRequested » à l’étape 4 devient vrai, ce qui fait que nous n’entrons plus dans la boucle while et ne demandons plus le renouvellement du bail.
C#

 

Étape 6: Libérer le bail

Enfin, pour libérer le bail, il suffit d’appeler la méthode « Release Async ».

C#

 

Conclusion

Les verrous font partie des modèles fondamentaux dans les systèmes distribués pour obtenir un accès exclusif aux ressources. Il est nécessaire de garder à l’esprit les pièges lorsqu’on travaille avec eux pour le bon déroulement des opérations. En utilisant Azure Storage, nous pouvons mettre en œuvre ces mécanismes de verrouillage efficaces qui peuvent éviter le blocage indéfini et, en même temps, offrir de l’élasticité dans la manière dont les verrous sont maintenus.

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