KärndataSamordning

Distribuerade lås

Se till att bara en arbetare kör ett jobb åt gången, med lås som löper ut av sig själva och släpps säkert av sin ägare.

kommando för att ta låset
1
kommando för att släppa det säkert
1
Lua-skript
0
Steg 1 av 5
Arbetare A tar låset

NX tar det bara om ingen håller det. PX 30000 gör att det löper ut efter 30 sekunder om A dör.

Exempelsessionplaying
# Arbetare A tar låset
hotkv> SET lock:billing-run tok-a81f NX PX 30000
OK

En animerad genomgång med riktiga HotKV-kommandon och exempelsvar. Klicka på valfritt steg för att hoppa dit. Kommandon och svar förblir på engelska, precis som du skriver och ser dem i HotKV.

Problemet

Cron-jobb på flera maskiner, betalningsuttag och ombyggnader av cache får inte köras två gånger samtidigt. Ett lås utan utgångstid hålls för evigt när dess ägare kraschar, och att släppa ett lås med en vanlig DEL kan radera någon annans lås efter att ditt har löpt ut.

Så löser HotKV det

SET med NX och PX tar ett lås bara om ingen håller det, och ger det en utgångstid så att en kraschad ägare inte kan hålla det för evigt. Varje ägare lagrar en slumpmässig token som värde. DELEX med IFEQ raderar låset bara om det fortfarande innehåller din token, vilket är den säkra frigöringen som tidigare krävde ett Lua-skript.

Steg för steg

Vad som händer, kommando för kommando

  1. 01

    Arbetare A tar låset

    NX tar det bara om ingen håller det. PX 30000 gör att det löper ut efter 30 sekunder om A dör.

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

    Arbetare B avvisas

    Låset hålls, så B får nil och hoppar över den här körningen.

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

    A gör jobbet

    Bara en arbetare kör faktureringsjobbet.

    PTTL lock:billing-run
  4. 04

    Släpp bara ditt eget lås

    DELEX raderar nyckeln bara om värdet fortfarande är A:s token.

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

    En fel token gör ingenting

    Om A hade varit för långsam och B nu höll låset skulle A:s frigöring lämna B:s lås ifred.

    DELEX lock:billing-run IFEQ tok-stale
Där det passar

Verkliga scenarier

Schemalagda jobb

Samma cron körs på varje instans, och låset ser till att exakt en av dem gör arbetet.

Betalningar

Uttag och återbetalningar på en och samma order serialiseras så att de aldrig överlappar.

Skydd mot cache stampede

Bara en förfrågan bygger om en dyr cachepost medan de andra väntar eller serverar det gamla värdet.

Inbyggt

Det här får du

Ta med utgångstid

SET NX PX tar låset bara om det är ledigt, med en tidsgräns.

SETNXPX

Säker frigöring

DELEX IFEQ raderar bara om värdet matchar din token.

DELEX

Förläng medan du arbetar

Kontrollera återstående tid och förläng den för långa jobb.

PTTLPEXPIRE

Jämför via digest

För stora värden jämför DELEX IFDEQ en digest i stället för hela värdet.

DIGESTIFDEQ

Vanliga frågor

Varför inte bara använda DEL på låset?

Om ditt lås löpte ut och en annan arbetare tog det skulle en vanlig DEL radera deras lås. DELEX IFEQ raderar det bara så länge det fortfarande innehåller din token.

Hur lång ska utgångstiden vara?

Längre än jobbet normalt tar. För långa jobb, förläng utgångstiden med jämna mellanrum så länge du fortfarande håller låset.

Behöver jag Lua för säker frigöring?

Nej. DELEX gör jämförelsen och raderingen i ett enda kommando.

Relaterade användningsfall

Prova på din egen arbetslast

HotKV talar Redis-protokollet, så du kan peka en befintlig klient mot det och köra samma kommandon.