Základní dataKoordinace

Distribuované zámky

Zajistěte, aby úlohu spouštěl vždy jen jeden worker, se zámky, které samy vyprší a jejich vlastník je bezpečně uvolňuje.

příkaz k získání
1
příkaz k bezpečnému uvolnění
1
skriptů v Lua
0
Krok 1 z 5
Worker A získá zámek

NX ho získá, jen pokud ho nikdo nedrží. PX 30000 způsobí, že za 30 sekund vyprší, kdyby A zemřel.

Ukázková relaceplaying
# Worker A získá zámek
hotkv> SET lock:billing-run tok-a81f NX PX 30000
OK

Animovaný průvodce se skutečnými příkazy HotKV a ukázkovými odpověďmi. Kliknutím na kterýkoli krok na něj přeskočíte. Příkazy a odpovědi zůstávají anglicky, přesně tak, jak je v HotKV zadáváte a vidíte.

Problém

Úlohy cron na několika strojích, zaúčtování plateb a přestavby cache se nesmějí spustit dvakrát najednou. Zámek bez expirace drží navždy, když jeho vlastník spadne, a uvolnění zámku prostým DEL může smazat cizí zámek poté, co ten váš vypršel.

Jak to řeší HotKV

SET s NX a PX získá zámek, jen pokud ho nikdo nedrží, a dá mu expiraci, takže spadlý vlastník ho nemůže držet navždy. Každý vlastník ukládá jako hodnotu náhodný token. DELEX s IFEQ zámek smaže, jen pokud stále obsahuje váš token, což je bezpečné uvolnění, které dřív vyžadovalo skript v Lua.

Krok za krokem

Co se děje, příkaz po příkazu

  1. 01

    Worker A získá zámek

    NX ho získá, jen pokud ho nikdo nedrží. PX 30000 způsobí, že za 30 sekund vyprší, kdyby A zemřel.

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

    Worker B je odmítnut

    Zámek je držen, takže B dostane nil a tento běh přeskočí.

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

    A dělá práci

    Fakturační úlohu spustí jen jeden worker.

    PTTL lock:billing-run
  4. 04

    Uvolnění jen vlastního zámku

    DELEX smaže klíč, jen pokud hodnota stále odpovídá tokenu A.

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

    Špatný token nic nedělá

    Kdyby A byl příliš pomalý a zámek už držel B, uvolnění od A by zámek B nechalo na pokoji.

    DELEX lock:billing-run IFEQ tok-stale
Kam to zapadá

Scénáře z praxe

Plánované úlohy

Stejný cron běží na každé instanci a zámek zajistí, že práci udělá právě jedna z nich.

Platby

Operace zaúčtování a vrácení u jedné objednávky se serializují, aby se nikdy nepřekrývaly.

Ochrana před cache stampede

Nákladnou položku cache přebuduje jen jeden požadavek, zatímco ostatní čekají nebo obslouží starou hodnotu.

Zabudováno

Co dostanete

Získání s expirací

SET NX PX získá zámek, jen pokud je volný, s timeoutem.

SETNXPX

Bezpečné uvolnění

DELEX IFEQ smaže, jen pokud hodnota odpovídá vašemu tokenu.

DELEX

Prodloužení při práci

Zkontrolujte zbývající čas a u dlouhých úloh ho prodlužte.

PTTLPEXPIRE

Porovnání podle digestu

U velkých hodnot DELEX IFDEQ porovnává digest místo celé hodnoty.

DIGESTIFDEQ
Reference:SETDELEXDIGEST

Časté otázky

Proč zámek prostě nesmazat pomocí DEL?

Pokud váš zámek vypršel a převzal ho jiný worker, prosté DEL by smazalo jeho zámek. DELEX IFEQ ho smaže, jen dokud stále obsahuje váš token.

Jak dlouhá by měla být expirace?

Delší, než úloha obvykle trvá. U dlouhých úloh expiraci pravidelně prodlužujte, dokud zámek držíte.

Potřebuji Lua pro bezpečné uvolnění?

Ne. DELEX provede porovnání a smazání jedním příkazem.

Související případy použití

Vyzkoušejte to na své zátěži

HotKV mluví protokolem Redisu, takže na něj můžete nasměrovat stávajícího klienta a spustit tytéž příkazy.