У меня есть приложение nodejs, которое работает на одном сервере. Мне нужно запустить приложение на нескольких серверах для балансировки нагрузки.
Это приложение одновременно обрабатывает только один запрос от конкретного пользователя. Если от пользователя получены одновременные запросы, запросы ставятся в очередь и выполняются один за другим. Это делается для обеспечения согласованности некоторых данных в базе данных, которые могут быть повреждены, если одновременные запросы обрабатываются приложением.
Поскольку я собираюсь запускать приложение на нескольких серверах, мне нужен способ запретить серверам обрабатывать одновременные запросы от одного пользователя. для этого я использовал базу данных Firebase в реальном времени для создания распределенной блокировки. Ниже приведена более простая версия моего кода.
function lockUser(user) {
return firebaseAdmin.database().ref('users/' + user + '/lock').transaction((currentData) => {
if (currentData === null || currentData.lockTime === 0) {
return {'lockTime': Date.now()};
}
}, null, false).then(async (result) => {
if (result.committed) {
return Promise.resolve();
}
log.info('failed to lock ' + user + '. retrying.');
await sleepFor(500);
return lockUser(user, user, res);
}).catch(async (reason) => {
log.info('lock failed. ' + user + '. reason: ' + reason + '. retrying');
await sleepFor(500);
return lockUser(user, user, res);
});
}
function unlockUser(user) {
log.info('unlocking firebase lock. ' + user);
firebaseAdmin.database().ref('users/' + user + '/lock').set({'lockTime': 0}, (error) => {
if (error) {
log.warn('failed to unlock ' + user + '. error: ' + util.inspect(error));
} else {
log.info('unlocked ' + user);
}
});
}
С приведенным выше кодом блокировка обычно занимает около 100 миллисекунд и в основном непротиворечива. Но редко иногда я наблюдаю значительную задержку завершения транзакции. В этом случае блокировка может занять около 30 секунд.
В чем может быть причина такой задержки? Есть ли причина, по которой я не должен использовать базу данных Firebase в реальном времени таким образом?