Slovník pojmů

Distribuovaný zámek: koordinace práce mezi procesy a servery

Zámek omezuje souběh kritické práce. Není to databázový zámek ani absolutní záruka správnosti business operace.

Stručná definice

Jeden držitel pro jasně vymezenou práci.

Hodí se například tehdy, když dvě instance aplikace mohou spustit stejnou plánovanou úlohu nebo když více workerů synchronizuje tentýž sklad. Cílem je mutual exclusion: v rámci zvolené garance má pracovat jen jeden držitel zámku.

Zámek pracuje v omezeném časovém okně. Musí proto počítat s pádem procesu, prodlevou sítě, pozastavením běhu i vypršením platnosti. Výsledek práce má mít vlastní ochranu proti duplicitě, i když před ní zámek existuje.

Použití

Kdy koordinace dává smysl

Zámek má být co nejužší a vázaný na konkrétní sdílený zdroj.

  • jedna plánovaná úloha napříč více servery
  • synchronizace konkrétního skladu nebo marketplace účtu
  • import dávky produktů, který nesmí souběžně měnit stejná data
  • omezení nákladného přepočtu reportu
  • koordinace workerů, pokud ji sama fronta neposkytuje

Praktický příklad

Synchronizace skladu warehouse-42

Dvě instance workeru dostanou stejný plánovací signál. Worker A se pokusí získat lock:stock-sync:warehouse-42 příkazem SET s náhodným tokenem, NX a PX 30000. Worker B neuspěje a úlohu ukončí nebo zařadí řízený retry.

A načte data dodavatele a zapíše změny. Zápis skladu musí zůstat bezpečný i při druhé události: constraint, stavový přechod nebo idempotency key chrání výsledný stav. Kdyby A po expiraci pokračoval, nesmí zámek B smazat ani přepsat novější data.

Sekvence dvou procesů

Worker A a Worker B soutěží o stejný sklad

TTL zvyšuje dostupnost po pádu, zároveň však vytváří riziko pozdě probuzeného držitele.

  1. A získá zámek Redis atomicky vytvoří klíč s tokenem A a TTL například třicet sekund.
  2. B neuspěje Klíč existuje, SET … NX vrátí neúspěch; B nesmí cizí zámek mazat.
  3. A pracuje Kritická část má být krátká. Při prodlužování lease A ověřuje, že je stále vlastníkem.
  4. TTL vyprší A může být pozastavený. B pak získá nový zámek s odlišným tokenem.
  5. Stale owner Pozdní A nesmí odemknout B ani přepsat novější stav; kritické cíle mohou používat fencing token.

Důležité vlastnosti

Token, TTL a atomické podmínky

Mechanismus musí odlišit vlastníka zámku od dalšího pokusu o stejnou práci.

SET NX PX

V Redis lze základní získání zámku provést atomicky příkazem SET key token NX PX ttl: klíč vznikne jen pokud neexistuje a dostane expiraci.

Owner token

Náhodná jedinečná hodnota patří jednomu pokusu. Prosté DEL je chybné: pozdní proces by mohl smazat zámek, který po expiraci získal někdo jiný.

Lease a prodloužení

TTL chrání před trvalým blokem po pádu. Prodloužení musí porovnat token a proběhnout atomicky; nekonečné prodlužování zhoršuje dostupnost.

Fencing token

Rostoucí číslo musí pocházet z monotónního autoritativního zdroje. Cílová služba ho při zápisu porovnává a odmítne starší příkaz; teprve tím chrání před stale ownerem lépe než samotný token.

Co zámek neřeší

Zámek, idempotence a autoritativní data

Souběh a duplicitní businessový účinek jsou rozdílné problémy.

Idempotence
Určuje, že opakovaný příkaz nevytvoří druhý výsledek. Je nutná po timeoutu a duplicitním doručení.
Unikátní constraint
Databázově chrání business identitu i tehdy, když zámek selže nebo skončí.
Failover
Replika a failover neznamenají automaticky silnou konzistenci; síťové oddělení může vytvořit nejistotu vlastnictví.
Exactly once
Zámek ani jedno ID zprávy neslibují end-to-end přesně jedno zpracování. Příjemce potřebuje idempotentní návrh.

Výhody a omezení

Užitečná koordinace, nikoli univerzální pojistka

Přínosy

  • omezuje konfliktní a nákladnou souběžnou práci
  • TTL nakonec uvolní zdroj po pádu držitele
  • umožní provozovat jednu úlohu na více instancích
  • vymezí kritickou část a její skutečně sdílený zdroj

Časté chyby

  • DEL bez ověření owner tokenu
  • držení zámku přes dlouhý import, čekání na HTTP nebo uživatelskou interakci
  • globální zámek pro celý e-shop místo konkrétního zdroje
  • použití zámku místo constraintu a idempotence

Hranice použití

Přiměřený mechanismus podle požadované garance.

Pro krátkou úlohu může stačit databázový constraint nebo plánovač s jediným během. Redis lock je přiměřený pro úzkou kritickou sekci, například jeden sklad nebo jeden marketplace účet.

U citlivé koordinace nestačí pohodlné API zámku. Je nutné posoudit stale ownery, failover, fencing tokeny i to, zda cílové úložiště umí odmítnout zastaralý zápis.

Na co myslet

Zámek má být měřitelný a krátký

Než ho zavedete, ověřte, jak systém zachází s neúspěšným získáním i pádem držitele.

  • jednoznačný klíč zámku podle konkrétního zdroje
  • náhodný owner token a podmíněné uvolnění
  • TTL odpovídající reálné kritické části
  • měření kolizí, expirací a délky držení
  • idempotentní zápis výsledku a databázová ochrana

Časté otázky

Co distribuovaný zámek garantuje

Je Redis lock totéž co SETNX?

Ne. SETNX je starší příkaz pro podmíněné vytvoření klíče. Nový návrh používá SET s NX a expirací, owner tokenem a bezpečným uvolněním.

Proč nestačí zámek po dokončení smazat DEL?

Původní proces mohl být pozastavený. Jeho TTL vypršelo a zámek získal jiný proces; pozdní DEL by odstranil cizí zámek.

Zaručí zámek přesně jedno zpracování zprávy?

Ne. Zpráva se může doručit znovu a klient opakovat požadavek. Výsledný stav potřebuje idempotenci a obvykle databázovou ochranu.

Musím použít Redlock?

Ne nutně. Jedna Redis instance s TTL může být přiměřená pro méně kritickou koordinaci. U vyšší konzistence je nutné posoudit failover, síťové oddělení a fencing tokeny.

Jak princip používám v praxi

Koordinaci úloh navrhuji spolu s ochranou výsledného stavu.

Ve veřejném projektu scheduling jsou vidět principy plánování úloh napříč servery, testování a odolnosti vůči souběhu.

Zavolejte mi

Zavolám vám následující pracovní den mezi 9:00 a 17:00.

Můžete mi také zavolat rovnou.

+420 605 181 728

Nechte mi telefonní číslo a pošlete žádost o zpětné zavolání.

Odesláním souhlasíte se zpracováním údajů pro vyřízení žádosti.