Время ожидания срабатывания пожарного хранилища иногда - PullRequest
0 голосов
/ 11 декабря 2018

У меня есть Триггер Cloud Firestore , который заботится о настройке баланса кошелька пользователя в моем приложении.

exports.onCreateTransaction = functions.firestore
    .document('accounts/{accountId}/transactions/{transactionId}')
    .onCreate(async (snap, context) => {
        const { accountId, transactionId  } = context.params;

        const transaction = snap.data();

        // See the implementation of alreadyTriggered in the next code block
        const alreadyTriggered = await firestoreHelpers.triggers.alreadyTriggered(context);

        if (alreadyTriggered) {
            return null;
        }

        if (transaction.status === 'confirmed') {
            const accountRef = firestore
                .collection('accounts')
                .doc(accountId);

            const account = (await accountRef.get()).data();
            const balance = transaction.type === 'deposit' ? 
                    account.balance + transaction.amount : 
                    account.balance - transaction.amount;

            await accountRef.update({ balance });
        }

        return snap.ref.update({ id: transactionId });
    });

Поскольку триггер может на самом деле вызываться более одного раза , я добавил эту alreadyTriggered вспомогательную функцию:

const alreadyTriggered = (event) => {
    return firestore.runTransaction(async transaction => {
        const { eventId } = event;
        const metaEventRef = firestore.doc(`metaEvents/${eventId}`);
        const metaEvent = await transaction.get(metaEventRef);

        if (metaEvent.exists) {
            console.error(`Already triggered function for event: ${eventId}`);
            return true;
        } else {
            await transaction.set(metaEventRef, event);
            return false;
        }
    })
};

В большинстве случаев все работаеткак и ожидалось.Однако сегодня я получил ошибку тайм-аута, которая привела к несогласованности данных в базе данных.

Выполнение функции заняло 60005 мс, завершено со статусом: «тайм-аут»

В чем причина этого таймаута?И как я могу убедиться, что это никогда не повторится, чтобы мои транзакции были успешно отражены в балансе счета?

1 Ответ

0 голосов
/ 11 декабря 2018

Заявление о неоднократном исполнении было бета-ограничением, как уже говорилось.Облачные функции сейчас не бета.Текущей гарантией является по крайней мере один раз выполнение по умолчанию.вы получите несколько возможных событий, если вы включите повторные попытки в консоли Cloud.Это то, что вы должны сделать, если хотите убедиться, что ваши события обрабатываются надежно.

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

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