Dati di baseCoordinamento

Lock distribuiti

Assicurati che un solo worker alla volta esegua un job, con lock che scadono da soli e vengono rilasciati in sicurezza dal loro proprietario.

comando per acquisire
1
comando per rilasciare in sicurezza
1
script Lua
0
Passo 1 di 5
Il worker A prende il lock

NX lo prende solo se nessuno lo detiene. PX 30000 lo fa scadere in 30 secondi se A muore.

Sessione di esempioplaying
# Il worker A prende il lock
hotkv> SET lock:billing-run tok-a81f NX PX 30000
OK

Una dimostrazione animata con comandi HotKV reali e risposte di esempio. Clicca su un passo qualsiasi per andarci. Comandi e risposte restano in inglese, esattamente come li digiti e li vedi in HotKV.

Il problema

Cron job su più macchine, catture di pagamento e ricostruzioni della cache non devono girare due volte contemporaneamente. Un lock senza scadenza resta acquisito per sempre quando il suo proprietario si blocca, e rilasciare un lock con un semplice DEL può cancellare il lock di qualcun altro dopo che il tuo è scaduto.

Come lo gestisce HotKV

SET con NX e PX acquisisce un lock solo se nessuno lo detiene, e gli dà una scadenza perché un proprietario bloccato non possa tenerlo per sempre. Ogni proprietario salva un token casuale come valore. DELEX con IFEQ cancella il lock solo se contiene ancora il tuo token, ed è il rilascio sicuro che prima richiedeva uno script Lua.

Passo dopo passo

Cosa succede, comando per comando

  1. 01

    Il worker A prende il lock

    NX lo prende solo se nessuno lo detiene. PX 30000 lo fa scadere in 30 secondi se A muore.

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

    Il worker B viene respinto

    Il lock è occupato, quindi B riceve nil e salta questa esecuzione.

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

    A fa il lavoro

    Un solo worker esegue il job di fatturazione.

    PTTL lock:billing-run
  4. 04

    Rilascia solo il tuo lock

    DELEX cancella la chiave solo se il valore è ancora il token di A.

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

    Un token sbagliato non fa nulla

    Se A fosse stato troppo lento e ora il lock fosse di B, il rilascio di A lascerebbe intatto il lock di B.

    DELEX lock:billing-run IFEQ tok-stale
Dove si usa

Scenari reali

Job pianificati

Lo stesso cron gira su ogni istanza, e il lock garantisce che esattamente una di esse faccia il lavoro.

Pagamenti

Le operazioni di cattura e rimborso su un ordine vengono serializzate, così non si sovrappongono mai.

Protezione dal cache stampede

Una sola richiesta ricostruisce una voce di cache costosa mentre le altre aspettano o servono il valore obsoleto.

Integrato

Cosa ottieni

Acquisizione con scadenza

SET NX PX prende il lock solo se è libero, con un timeout.

SETNXPX

Rilascio sicuro

DELEX IFEQ cancella solo se il valore corrisponde al tuo token.

DELEX

Estendi mentre lavori

Controlla il tempo rimanente ed estendilo per i job lunghi.

PTTLPEXPIRE

Confronto tramite digest

Per i valori grandi, DELEX IFDEQ confronta un digest invece del valore completo.

DIGESTIFDEQ
Riferimento:SETDELEXDIGEST

Domande frequenti

Perché non fare semplicemente DEL del lock?

Se il tuo lock è scaduto e un altro worker l'ha preso, un semplice DEL cancellerebbe il suo lock. DELEX IFEQ lo cancella solo finché contiene ancora il tuo token.

Quanto dovrebbe durare la scadenza?

Più di quanto dura normalmente il job. Per i job lunghi, estendi periodicamente la scadenza finché detieni ancora il lock.

Mi serve Lua per un rilascio sicuro?

No. DELEX fa il confronto e la cancellazione in un solo comando.

Casi d'uso correlati

Provalo sul tuo carico di lavoro

HotKV parla il protocollo Redis, quindi puoi puntarci un client esistente ed eseguire questi stessi comandi.