Dane podstawoweKoordynacja

Blokady rozproszone

Upewnij się, że tylko jeden worker uruchamia zadanie naraz, z blokadami, które same wygasają i są bezpiecznie zwalniane przez właściciela.

polecenie do zajęcia
1
polecenie do bezpiecznego zwolnienia
1
skryptów Lua
0
Krok 1 z 5
Worker A zajmuje blokadę

NX zajmuje ją tylko wtedy, gdy nikt jej nie trzyma. PX 30000 sprawia, że wygasa po 30 sekundach, jeśli A padnie.

Przykładowa sesjaplaying
# Worker A zajmuje blokadę
hotkv> SET lock:billing-run tok-a81f NX PX 30000
OK

Animowany przegląd z prawdziwymi poleceniami HotKV i przykładowymi odpowiedziami. Kliknij dowolny krok, aby do niego przejść. Polecenia i odpowiedzi pozostają po angielsku, dokładnie tak, jak je wpisujesz i widzisz w HotKV.

Problem

Zadania cron na kilku maszynach, pobrania płatności i przebudowy cache nie mogą uruchomić się dwa razy naraz. Blokada bez czasu wygaśnięcia jest trzymana wiecznie, gdy jej właściciel ulegnie awarii, a zwolnienie blokady zwykłym DEL może usunąć cudzą blokadę po wygaśnięciu Twojej.

Jak radzi sobie z tym HotKV

SET z NX i PX zajmuje blokadę tylko wtedy, gdy nikt jej nie trzyma, i nadaje jej czas wygaśnięcia, aby właściciel, który uległ awarii, nie trzymał jej wiecznie. Każdy właściciel zapisuje jako wartość losowy token. DELEX z IFEQ usuwa blokadę tylko wtedy, gdy nadal zawiera Twój token, czyli bezpieczne zwolnienie, które wcześniej wymagało skryptu Lua.

Krok po kroku

Co się dzieje, polecenie po poleceniu

  1. 01

    Worker A zajmuje blokadę

    NX zajmuje ją tylko wtedy, gdy nikt jej nie trzyma. PX 30000 sprawia, że wygasa po 30 sekundach, jeśli A padnie.

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

    Worker B zostaje odesłany

    Blokada jest zajęta, więc B dostaje nil i pomija ten przebieg.

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

    A wykonuje pracę

    Tylko jeden worker uruchamia zadanie rozliczeń.

    PTTL lock:billing-run
  4. 04

    Zwolnij tylko własną blokadę

    DELEX usuwa klucz tylko wtedy, gdy wartość nadal jest tokenem A.

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

    Zły token nic nie robi

    Gdyby A był zbyt wolny, a B trzymał już blokadę, zwolnienie przez A zostawiłoby blokadę B w spokoju.

    DELEX lock:billing-run IFEQ tok-stale
Gdzie się sprawdza

Scenariusze z życia

Zadania harmonogramu

Ten sam cron działa na każdej instancji, a blokada zapewnia, że dokładnie jedna z nich wykonuje pracę.

Płatności

Operacje pobrania i zwrotu dla jednego zamówienia są serializowane, aby nigdy się nie nakładały.

Ochrona przed stampede cache

Tylko jedno żądanie przebudowuje kosztowny wpis cache, podczas gdy pozostałe czekają lub serwują nieaktualną wartość.

Wbudowane

Co dostajesz

Zajmowanie z wygasaniem

SET NX PX zajmuje blokadę tylko wtedy, gdy jest wolna, z limitem czasu.

SETNXPX

Bezpieczne zwolnienie

DELEX IFEQ usuwa tylko wtedy, gdy wartość pasuje do Twojego tokenu.

DELEX

Przedłużanie podczas pracy

Sprawdź pozostały czas i przedłuż go dla długich zadań.

PTTLPEXPIRE

Porównanie przez skrót

Dla dużych wartości DELEX IFDEQ porównuje skrót zamiast pełnej wartości.

DIGESTIFDEQ

Częste pytania

Dlaczego nie po prostu DEL blokady?

Jeśli Twoja blokada wygasła, a inny worker ją zajął, zwykłe DEL usunęłoby jego blokadę. DELEX IFEQ usuwa ją tylko, dopóki nadal zawiera Twój token.

Jak długi powinien być czas wygaśnięcia?

Dłuższy niż zwykle trwa zadanie. Dla długich zadań przedłużaj okresowo czas wygaśnięcia, dopóki trzymasz blokadę.

Czy potrzebuję Lua do bezpiecznego zwolnienia?

Nie. DELEX wykonuje porównanie i usunięcie w jednym poleceniu.

Powiązane przypadki użycia

Wypróbuj na własnym obciążeniu

HotKV mówi protokołem Redis, więc możesz skierować na niego istniejącego klienta i uruchomić te same polecenia.