KerndataCoördinatie

Gedistribueerde locks

Zorg dat slechts één worker tegelijk een job uitvoert, met locks die vanzelf verlopen en veilig door hun eigenaar worden vrijgegeven.

commando om te verkrijgen
1
commando om veilig vrij te geven
1
Lua-scripts
0
Stap 1 van 5
Worker A pakt de lock

NX pakt hem alleen als niemand hem vasthoudt. PX 30000 laat hem na 30 seconden verlopen als A sterft.

Voorbeeldsessieplaying
# Worker A pakt de lock
hotkv> SET lock:billing-run tok-a81f NX PX 30000
OK

Een geanimeerde walkthrough met echte HotKV-commando's en voorbeeldantwoorden. Klik op een stap om ernaartoe te springen. Commando's en antwoorden blijven Engels, precies zoals je ze in HotKV typt en ziet.

Het probleem

Cronjobs op meerdere machines, betalingsafschrijvingen en cachehersteloperaties mogen niet tegelijk twee keer draaien. Een lock zonder verloopdatum wordt eeuwig vastgehouden als zijn eigenaar crasht, en een lock vrijgeven met een gewone DEL kan de lock van iemand anders verwijderen nadat die van jou is verlopen.

Hoe HotKV het aanpakt

SET met NX en PX verkrijgt een lock alleen als niemand hem vasthoudt, en geeft hem een verloopdatum zodat een gecrashte eigenaar hem niet eeuwig kan vasthouden. Elke eigenaar slaat een willekeurig token op als waarde. DELEX met IFEQ verwijdert de lock alleen als hij nog jouw token bevat, wat de veilige vrijgave is waarvoor vroeger een Lua-script nodig was.

Stap voor stap

Wat er gebeurt, commando voor commando

  1. 01

    Worker A pakt de lock

    NX pakt hem alleen als niemand hem vasthoudt. PX 30000 laat hem na 30 seconden verlopen als A sterft.

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

    Worker B wordt weggestuurd

    De lock wordt vastgehouden, dus B krijgt nil en slaat deze run over.

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

    A doet het werk

    Slechts één worker voert de factureringsjob uit.

    PTTL lock:billing-run
  4. 04

    Geef alleen je eigen lock vrij

    DELEX verwijdert de sleutel alleen als de waarde nog het token van A is.

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

    Een verkeerd token doet niets

    Als A te traag was geweest en B nu de lock vasthield, zou de vrijgave van A de lock van B met rust laten.

    DELEX lock:billing-run IFEQ tok-stale
Waar het past

Praktijkscenario's

Geplande jobs

Dezelfde cron draait op elke instantie, en de lock zorgt ervoor dat precies één ervan het werk doet.

Betalingen

Afschrijvings- en terugbetalingsoperaties op één bestelling worden geserialiseerd zodat ze nooit overlappen.

Bescherming tegen cache-stampede

Slechts één verzoek herbouwt een dure cache-entry terwijl de andere wachten of de verouderde waarde serveren.

Ingebouwd

Wat je krijgt

Verkrijgen met verloopdatum

SET NX PX pakt de lock alleen als hij vrij is, met een time-out.

SETNXPX

Veilige vrijgave

DELEX IFEQ verwijdert alleen als de waarde overeenkomt met jouw token.

DELEX

Verlengen tijdens het werk

Controleer de resterende tijd en verleng hem voor lange jobs.

PTTLPEXPIRE

Vergelijken op digest

Voor grote waarden vergelijkt DELEX IFDEQ een digest in plaats van de volledige waarde.

DIGESTIFDEQ
Referentie:SETDELEXDIGEST

Veelgestelde vragen

Waarom niet gewoon DEL op de lock?

Als jouw lock is verlopen en een andere worker hem heeft gepakt, zou een gewone DEL hun lock verwijderen. DELEX IFEQ verwijdert hem alleen zolang hij nog jouw token bevat.

Hoe lang moet de verloopdatum zijn?

Langer dan de job normaal duurt. Verleng bij lange jobs de verloopdatum periodiek zolang je de lock nog vasthoudt.

Heb ik Lua nodig voor veilige vrijgave?

Nee. DELEX doet het vergelijken en verwijderen in één commando.

Verwante use cases

Probeer het op je eigen workload

HotKV spreekt het Redis-protocol, dus je kunt een bestaande client erop richten en dezelfde commando's uitvoeren.