У меня есть Триггер 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 мс, завершено со статусом: «тайм-аут»
В чем причина этого таймаута?И как я могу убедиться, что это никогда не повторится, чтобы мои транзакции были успешно отражены в балансе счета?