我阅读了此文档并将最佳实践应用到我的云功能中。我观察到,当发生错误时它实际上会重试。但是当我重读文档时,我感到有点困惑,因为当一个函数像这样重试时,我怎么知道在这个触发器中,该函数实际上重试了,并且我想以尽可能详细的方式记录该函数的重试,并且如果重试失败,我如何检测失败并将其注销?
我确实尝试过,就像最佳实践指导我一样,这是我的云存储触发器的示例代码
const { onObjectFinalized, onObjectDeleted, onObjectMetadataUpdated } = require('firebase-functions/v2/storage');
const env = require('./env.dev.json');
exports.storageInsertTrigger = onObjectFinalized({
bucket: env.BUCKET_ARRAY[1],
memory: '2GiB',
timeoutSeconds: 120,
retry: true
}, async event => {
const eventAge = Date.now() - Date.parse(event.time);
const eventMaxAge = 10000;
const metadata = event.data ? Object.assign({}, event.data.metadata) : {};
const eventId = event.id;
// Ignore events that are too old
if (eventAge > eventMaxAge) {
console.log(`DROPPING EVENT TRIGGERED - PATH FILE: ${event.data.name} / EVENT ID: ${eventId} with age ${eventAge} ms.`, "[EVENT MAX AGE REACHED]");
return Promise.resolve();
}
// .... Processing data .... => create object newObjFS for firestore insert.
const functionResult = await admin.firestore().collection(myCollection).doc(eventId).set(newObjFS).then(() => {
console.log(`FIRESTORE - Object ID: ${event.data.name} - Event ID: ${eventId}`);
return Promise.resolve();
}).catch((error) => {
console.log(error);
return Promise.reject(error);
});
return functionResult;
} catch (error) {
console.error(error);
return Promise.reject(error);
}
});
我怎么知道在这个触发器中,函数实际上重试了
eventId
,它在重试之间不会改变。 您可以在调用之间自行跟踪 eventId(保存到数据库或其他数据存储) - Cloud Functions 不会为您执行此操作。
如果重试失败,我如何检测失败并将其注销
执行失败没有回调或通知。 在函数执行过程中,您可以捕获并处理任何错误,让您满意。
如果函数执行成功,重试是否会在第二次尝试时停止?
成功完成的函数不一定会立即停止重试,因为不能保证 Cloud Functions 会从您的函数中获得成功结果。 函数结果是异步报告的,如果出现系统错误,可能会丢失。 如果函数没有生成错误,重试将“最终”停止。 您的代码需要具有逻辑来防止意外重试。 我建议仔细阅读
文档