Что произойдет, если ресурс уже заблокирован?

#node.js #redis #redlock

Вопрос:

Я пытаюсь использовать RedLock, чтобы запретить 2 пользователям выполнять операцию на одном и том же ресурсе одновременно (слишком быстро заказывать что-то друг у друга). Но я хочу, чтобы он полностью провалился, если ресурс уже приобретен кем-то другим (доступность бронирования исчезнет после совершения транзакции запроса). Мне не ясно в документах, что произойдет, если ресурс все еще заблокирован, и как выйти из строя в этот момент. Это просто выдает ошибку? https://github.com/mike-marcacci/node-redlock#usage-promise-style.

 const redlock = new Redlock(...);
let lock;
try {
  lock = redlock.lock('bookId', 120000);
} catch (err) {
  // ... lock failed to be acquired because someone else still had it? (after retries are finish)
}
 

Комментарии:

1. Документ для node-redlock довольно отсутствует для объяснения того, как на самом .lock() деле работает метод и каково его точное поведение. Похоже, что он реализует «Алгоритм Редлока», о котором вы можете прочитать здесь . Это до некоторой степени объясняет тайм-ауты и обработку ошибок. Вы управляете параметрами повторной попытки с помощью опций new Redlock(...) .

Ответ №1:

Приведенный выше пример, который я использовал, действительно сработал. Как только все попытки получить блокировку будут потрачены, это приведет к ошибке. В большинстве случаев взаимного исключения этого не должно происходить. Он должен быть настроен таким образом, чтобы у других клиентов, ожидающих заблокированного ресурса, было достаточно времени, чтобы в конечном итоге получить его. В случае, если вы хотите, чтобы он полностью вышел из строя (вы не хотите, чтобы второй клиент когда-либо получал ресурс), просто настройте Redlock для одной попытки, и Redlock сработает.

 const redlock = new Redlock(...);
let lock;
try {
  lock = redlock.lock('bookId', 120000);
} catch (err) {
  // Attempted to grab lock but failed after all attempts (configured) are finished
}