Базові даніКоординація

Розподілені блокування

Переконайтеся, що завдання виконує лише один воркер за раз, з блокуваннями, що спливають самі та безпечно знімаються власником.

команда для отримання
1
команда для безпечного зняття
1
скриптів Lua
0
Крок 1 з 5
Воркер A бере блокування

NX бере його, лише якщо ніхто не тримає. PX 30000 робить так, що воно спливає за 30 секунд, якщо A помре.

Приклад сесіїplaying
# Воркер A бере блокування
hotkv> SET lock:billing-run tok-a81f NX PX 30000
OK

Анімований покроковий розбір з реальними командами HotKV і прикладами відповідей. Натисніть будь-який крок, щоб перейти до нього. Команди та відповіді залишаються англійською, так само, як ви вводите й бачите їх у HotKV.

Проблема

Cron-завдання на кількох машинах, списання платежів і перебудови кешу не повинні виконуватися двічі одночасно. Блокування без терміну дії тримається вічно, якщо його власник упав, а зняття блокування звичайним DEL може видалити чуже блокування після спливання вашого.

Як це вирішує HotKV

SET з NX і PX отримує блокування, лише якщо його ніхто не тримає, і дає йому термін дії, щоб власник, що впав, не тримав його вічно. Кожен власник зберігає випадковий токен як значення. DELEX з IFEQ видаляє блокування, лише якщо воно досі містить ваш токен, і це безпечне зняття, яке раніше потребувало скрипта Lua.

Крок за кроком

Що відбувається, команда за командою

  1. 01

    Воркер A бере блокування

    NX бере його, лише якщо ніхто не тримає. PX 30000 робить так, що воно спливає за 30 секунд, якщо A помре.

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

    Воркера B відхилено

    Блокування утримується, тож B отримує nil і пропускає цей запуск.

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

    A виконує роботу

    Завдання виставлення рахунків виконує лише один воркер.

    PTTL lock:billing-run
  4. 04

    Знімайте лише власне блокування

    DELEX видаляє ключ, лише якщо значення досі є токеном A.

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

    Неправильний токен нічого не робить

    Якби A був надто повільним, а B уже тримав блокування, зняття від A не зачепило б блокування B.

    DELEX lock:billing-run IFEQ tok-stale
Де це доречно

Реальні сценарії

Заплановані завдання

Той самий cron запускається на кожному екземплярі, а блокування гарантує, що роботу виконує рівно один із них.

Платежі

Операції списання й повернення для одного замовлення серіалізуються, щоб ніколи не перетиналися.

Захист від лавини кешу

Лише один запит перебудовує дорогий запис кешу, а інші чекають або віддають застаріле значення.

Вбудовано

Що ви отримуєте

Отримання з терміном дії

SET NX PX бере блокування, лише якщо воно вільне, із тайм-аутом.

SETNXPX

Безпечне зняття

DELEX IFEQ видаляє лише якщо значення збігається з вашим токеном.

DELEX

Продовження під час роботи

Перевірте час, що залишився, і продовжте його для довгих завдань.

PTTLPEXPIRE

Порівняння за дайджестом

Для великих значень DELEX IFDEQ порівнює дайджест, а не повне значення.

DIGESTIFDEQ
Довідка:SETDELEXDIGEST

Поширені запитання

Чому не просто DEL блокування?

Якщо ваше блокування спливло й інший воркер його взяв, звичайний DEL видалив би його блокування. DELEX IFEQ видаляє його лише доки воно містить ваш токен.

Яким має бути термін дії?

Довшим, ніж зазвичай триває завдання. Для довгих завдань періодично продовжуйте термін дії, поки ви ще тримаєте блокування.

Чи потрібен мені Lua для безпечного зняття?

Ні. DELEX виконує порівняння та видалення однією командою.

Пов'язані сценарії використання

Спробуйте на власному навантаженні

HotKV розмовляє протоколом Redis, тож ви можете направити на нього наявний клієнт і виконувати ті самі команди.