#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
}