Date de bazăCoordonare

Blocări distribuite

Asigurați-vă că un singur worker rulează un job la un moment dat, cu blocări care expiră singure și sunt eliberate în siguranță de proprietarul lor.

comandă pentru obținere
1
comandă pentru eliberare sigură
1
scripturi Lua
0
Pasul 1 din 5
Workerul A preia blocarea

NX o preia doar dacă nimeni nu o deține. PX 30000 o face să expire în 30 de secunde dacă A se oprește.

Sesiune de exempluplaying
# Workerul A preia blocarea
hotkv> SET lock:billing-run tok-a81f NX PX 30000
OK

O demonstrație animată cu comenzi HotKV reale și răspunsuri de exemplu. Faceți clic pe orice pas pentru a sări la el. Comenzile și răspunsurile rămân în engleză, exact așa cum le tastați și le vedeți în HotKV.

Problema

Joburile cron de pe mai multe mașini, capturile de plăți și reconstruirile de cache nu trebuie să ruleze de două ori simultan. O blocare fără expirare rămâne ținută la nesfârșit când proprietarul ei se oprește brusc, iar eliberarea unei blocări cu un simplu DEL poate șterge blocarea altcuiva după ce a ta a expirat.

Cum o rezolvă HotKV

SET cu NX și PX obține o blocare doar dacă nimeni nu o deține și îi dă o expirare, ca un proprietar oprit brusc să n-o țină la nesfârșit. Fiecare proprietar stochează un token aleatoriu drept valoare. DELEX cu IFEQ șterge blocarea doar dacă încă are tokenul dvs., ceea ce este eliberarea sigură care înainte cerea un script Lua.

Pas cu pas

Ce se întâmplă, comandă cu comandă

  1. 01

    Workerul A preia blocarea

    NX o preia doar dacă nimeni nu o deține. PX 30000 o face să expire în 30 de secunde dacă A se oprește.

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

    Workerul B este respins

    Blocarea este ținută, deci B primește nil și sare peste această rulare.

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

    A face munca

    Doar un singur worker rulează jobul de facturare.

    PTTL lock:billing-run
  4. 04

    Eliberați doar propria blocare

    DELEX șterge cheia doar dacă valoarea este încă tokenul lui A.

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

    Un token greșit nu face nimic

    Dacă A ar fi fost prea lent și B ar fi ținut acum blocarea, eliberarea lui A ar lăsa în pace blocarea lui B.

    DELEX lock:billing-run IFEQ tok-stale
Unde se potrivește

Scenarii din lumea reală

Joburi programate

Același cron rulează pe fiecare instanță, iar blocarea se asigură că exact una dintre ele face munca.

Plăți

Operațiunile de captură și de rambursare pe o comandă sunt serializate, ca să nu se suprapună niciodată.

Protecție împotriva cache stampede

Doar o cerere reconstruiește o intrare de cache costisitoare, în timp ce celelalte așteaptă sau servesc valoarea veche.

Integrat

Ce primiți

Obținere cu expirare

SET NX PX preia blocarea doar dacă este liberă, cu un timeout.

SETNXPX

Eliberare sigură

DELEX IFEQ șterge doar dacă valoarea se potrivește cu tokenul dvs.

DELEX

Prelungire cât lucrați

Verificați timpul rămas și prelungiți-l pentru joburi lungi.

PTTLPEXPIRE

Comparare după digest

Pentru valori mari, DELEX IFDEQ compară un digest în loc de valoarea întreagă.

DIGESTIFDEQ
Referință:SETDELEXDIGEST

Întrebări frecvente

De ce să nu dau pur și simplu DEL pe blocare?

Dacă blocarea dvs. a expirat și alt worker a preluat-o, un simplu DEL i-ar șterge blocarea lui. DELEX IFEQ o șterge doar cât timp încă are tokenul dvs.

Cât de lungă ar trebui să fie expirarea?

Mai lungă decât durează de obicei jobul. Pentru joburi lungi, prelungiți periodic expirarea cât timp încă dețineți blocarea.

Am nevoie de Lua pentru o eliberare sigură?

Nu. DELEX face compararea și ștergerea într-o singură comandă.

Cazuri de utilizare înrudite

Încercați pe propria sarcină de lucru

HotKV vorbește protocolul Redis, așa că puteți îndrepta spre el un client existent și rula aceleași comenzi.