Données de baseCoordination

Verrous distribués

Assurez-vous qu'un seul worker exécute une tâche à la fois, avec des verrous qui expirent d'eux-mêmes et que leur propriétaire libère en toute sécurité.

commande pour acquérir
1
commande pour libérer sans risque
1
script Lua
0
Étape 1 sur 5
Le worker A prend le verrou

NX ne le prend que si personne ne le détient. PX 30000 le fait expirer au bout de 30 secondes si A tombe.

Session d’exempleplaying
# Le worker A prend le verrou
hotkv> SET lock:billing-run tok-a81f NX PX 30000
OK

Une démonstration animée avec de vraies commandes HotKV et des exemples de réponses. Cliquez sur une étape pour y accéder directement. Les commandes et les réponses restent en anglais, exactement comme vous les saisissez et les voyez dans HotKV.

Le problème

Les tâches cron sur plusieurs machines, les captures de paiement et les reconstructions de cache ne doivent pas s'exécuter deux fois en même temps. Un verrou sans expiration reste détenu pour toujours quand son propriétaire plante, et libérer un verrou avec un simple DEL peut supprimer le verrou de quelqu'un d'autre une fois le vôtre expiré.

Comment HotKV s'en charge

SET avec NX et PX n'acquiert un verrou que si personne ne le détient, et lui donne une expiration pour qu'un propriétaire planté ne puisse pas le garder indéfiniment. Chaque propriétaire stocke un jeton aléatoire comme valeur. DELEX avec IFEQ ne supprime le verrou que s'il contient encore votre jeton. C'est la libération sûre qui nécessitait autrefois un script Lua.

Étape par étape

Ce qui se passe, commande par commande

  1. 01

    Le worker A prend le verrou

    NX ne le prend que si personne ne le détient. PX 30000 le fait expirer au bout de 30 secondes si A tombe.

    SET lock:billing-run tok-a81f NX PX 30000
  2. 02

    Le worker B est refoulé

    Le verrou est détenu, B reçoit donc nil et saute cette exécution.

    SET lock:billing-run tok-b22c NX PX 30000
  3. 03

    A fait le travail

    Un seul worker exécute la tâche de facturation.

    PTTL lock:billing-run
  4. 04

    Ne libérer que son propre verrou

    DELEX ne supprime la clé que si la valeur est toujours le jeton de A.

    DELEX lock:billing-run IFEQ tok-a81f
  5. 05

    Un mauvais jeton ne fait rien

    Si A avait été trop lent et que B détenait maintenant le verrou, la libération de A laisserait le verrou de B intact.

    DELEX lock:billing-run IFEQ tok-stale
Où cela s'applique

Scénarios concrets

Tâches planifiées

Le même cron s'exécute sur chaque instance, et le verrou garantit qu'une seule d'entre elles fait le travail.

Paiements

Les opérations de capture et de remboursement d'une même commande sont sérialisées pour ne jamais se chevaucher.

Protection contre les cache stampedes

Une seule requête reconstruit une entrée de cache coûteuse pendant que les autres attendent ou servent la valeur périmée.

Intégré

Ce que vous obtenez

Acquisition avec expiration

SET NX PX ne prend le verrou que s'il est libre, avec un délai d'expiration.

SETNXPX

Libération sûre

DELEX IFEQ ne supprime que si la valeur correspond à votre jeton.

DELEX

Prolonger pendant le travail

Vérifiez le temps restant et prolongez-le pour les longues tâches.

PTTLPEXPIRE

Comparaison par empreinte

Pour les grosses valeurs, DELEX IFDEQ compare une empreinte au lieu de la valeur complète.

DIGESTIFDEQ
Référence :SETDELEXDIGEST

Questions fréquentes

Pourquoi ne pas simplement faire un DEL du verrou ?

Si votre verrou a expiré et qu'un autre worker l'a pris, un simple DEL supprimerait son verrou. DELEX IFEQ ne le supprime que tant qu'il contient votre jeton.

Quelle durée d'expiration choisir ?

Plus longue que la durée normale de la tâche. Pour les longues tâches, prolongez l'expiration régulièrement tant que vous détenez le verrou.

Ai-je besoin de Lua pour une libération sûre ?

Non. DELEX effectue la comparaison et la suppression en une seule commande.

Cas d'usage associés

Essayez-le sur votre propre charge de travail

HotKV parle le protocole Redis. Vous pouvez donc y connecter un client existant et exécuter ces mêmes commandes.