Каков шаблон для Google Cloud Functions для реализации мьютекса - PullRequest
0 голосов
/ 14 апреля 2019

Я использую запущенные 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);
        });
}

1 Ответ

0 голосов
/ 14 апреля 2019

Это не шаблон, который вы хотите реализовать в облачных функциях. Ограничение параллелизма облачных функций ограничит его масштабируемость, что противоречит принципу работы облачных функций. Чтобы узнать больше о масштабировании облачных функций, посмотрите это видео .

Если у вас есть база данных, которая должна иметь некоторую защиту от одновременного доступа, вы должны использовать собственные функции транзакций базы данных. Практически каждая база данных, которая обеспечивает одновременный доступ к данным, также обеспечивает некоторую возможность выполнения атомарных транзакций. Используйте эти транзакции, и пусть безсерверный контейнер масштабируется так, как ему удобно.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...