Я использую запущенные https облачные функции Google для обработки клиентских запросов на запись в базу данных. Данные структурированы таким образом, что большинство параллельных записей не приведет к повреждению.
В нескольких случаях мне нужно предотвратить одновременное выполнение нескольких действий записи для одного и того же элемента. Каковы общие шаблоны для блокировки доступа к некоторому ресурсу на функциональном уровне. Я ищу некоторые "мьютекс-подобные" функции.
Я думал о какой-то внешней службе, которая могла бы предоставить или запретить доступ к ресурсу для запроса экземпляров функций, но издержки соединения были бы огромными - рукопожатие каждый раз и т. Д.
Добавлен пример по запросу. В этом конкретном случае реструктуризация данных для отслеживания обновлений не является подходящим решением.
import * as admin from "firebase-admin";
function updateUserState(userId: string) {
// Query current state
admin
.database()
.ref()
.child(`/users/${userId}/state`)
.once("value")
.then(snapshot => {
return snapshot.val() || 0;
})
.then(currentState =>
// Perform some operation
modifyStateAsync(currentState)
)
.then(newState => {
admin
.database()
.ref()
.child(`/users/${userId}/state`)
.set(newState);
});
}