KerndatenKoordination

Verteilte Locks

Stellen Sie sicher, dass immer nur ein Worker einen Job ausführt, mit Locks, die von selbst ablaufen und von ihrem Besitzer sicher freigegeben werden.

Befehl zum Erwerben
1
Befehl zur sicheren Freigabe
1
Lua-Skripte
0
Schritt 1 von 5
Worker A nimmt den Lock

NX nimmt ihn nur, wenn ihn niemand hält. PX 30000 lässt ihn nach 30 Sekunden ablaufen, falls A ausfällt.

Beispielsitzungplaying
# Worker A nimmt den Lock
hotkv> SET lock:billing-run tok-a81f NX PX 30000
OK

Ein animierter Durchlauf mit echten HotKV-Befehlen und Beispielantworten. Klicken Sie auf einen Schritt, um direkt dorthin zu springen. Befehle und Antworten bleiben auf Englisch, genau so, wie Sie sie in HotKV eingeben und sehen.

Das Problem

Cronjobs auf mehreren Maschinen, Zahlungseinzüge und Cache-Neuaufbauten dürfen nicht zweimal gleichzeitig laufen. Ein Lock ohne Ablaufzeit bleibt für immer gehalten, wenn sein Besitzer abstürzt, und einen Lock mit einem einfachen DEL freizugeben, kann den Lock eines anderen löschen, nachdem Ihrer abgelaufen ist.

So löst HotKV es

SET mit NX und PX erwirbt einen Lock nur, wenn ihn niemand hält, und gibt ihm eine Ablaufzeit, damit ein abgestürzter Besitzer ihn nicht für immer halten kann. Jeder Besitzer speichert ein zufälliges Token als Wert. DELEX mit IFEQ löscht den Lock nur, wenn er noch Ihr Token enthält. Das ist die sichere Freigabe, für die man früher ein Lua-Skript brauchte.

Schritt für Schritt

Was passiert, Befehl für Befehl

  1. 01

    Worker A nimmt den Lock

    NX nimmt ihn nur, wenn ihn niemand hält. PX 30000 lässt ihn nach 30 Sekunden ablaufen, falls A ausfällt.

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

    Worker B wird abgewiesen

    Der Lock ist belegt, daher erhält B nil und überspringt diesen Lauf.

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

    A erledigt die Arbeit

    Nur ein Worker führt den Abrechnungsjob aus.

    PTTL lock:billing-run
  4. 04

    Nur den eigenen Lock freigeben

    DELEX löscht den Key nur, wenn der Wert noch das Token von A ist.

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

    Ein falsches Token bewirkt nichts

    Wäre A zu langsam gewesen und hielte B jetzt den Lock, ließe die Freigabe von A den Lock von B unberührt.

    DELEX lock:billing-run IFEQ tok-stale
Wo es passt

Szenarien aus der Praxis

Geplante Jobs

Derselbe Cronjob läuft auf jeder Instanz, und der Lock sorgt dafür, dass genau eine davon die Arbeit erledigt.

Zahlungen

Einzugs- und Erstattungsvorgänge für eine Bestellung werden serialisiert, sodass sie sich nie überschneiden.

Schutz vor Cache Stampedes

Nur eine Anfrage baut einen teuren Cache-Eintrag neu auf, während die anderen warten oder den veralteten Wert ausliefern.

Integriert

Was Sie bekommen

Erwerb mit Ablaufzeit

SET NX PX nimmt den Lock nur, wenn er frei ist, mit einem Timeout.

SETNXPX

Sichere Freigabe

DELEX IFEQ löscht nur, wenn der Wert Ihrem Token entspricht.

DELEX

Während der Arbeit verlängern

Prüfen Sie die verbleibende Zeit und verlängern Sie sie bei langen Jobs.

PTTLPEXPIRE

Vergleich per Digest

Bei großen Werten vergleicht DELEX IFDEQ einen Digest statt des vollständigen Werts.

DIGESTIFDEQ

Häufige Fragen

Warum den Lock nicht einfach mit DEL löschen?

Wenn Ihr Lock abgelaufen ist und ein anderer Worker ihn übernommen hat, würde ein einfaches DEL dessen Lock löschen. DELEX IFEQ löscht ihn nur, solange er noch Ihr Token enthält.

Wie lang sollte die Ablaufzeit sein?

Länger, als der Job normalerweise dauert. Verlängern Sie bei langen Jobs die Ablaufzeit regelmäßig, solange Sie den Lock noch halten.

Brauche ich Lua für eine sichere Freigabe?

Nein. DELEX erledigt Vergleich und Löschen in einem Befehl.

Verwandte Anwendungsfälle

Probieren Sie es mit Ihrer eigenen Workload

HotKV spricht das Redis-Protokoll, sodass Sie einen bestehenden Client darauf richten und genau diese Befehle ausführen können.