我有一个Google Cloud应用程序,其中包含几个调用API的云函数,然后将响应保存在Firebase中。我设置了此计划功能,以便在出错时重试API,并且效果很好。但是,如果我需要的数据还不存在,我想重试该呼叫。如果我抛出错误,可以立即再次拨打电话,但是丢失的数据不太可能在几秒钟后可用,因此我宁愿每小时检查一次,直到获得有效数据为止。
下面是我的函数的简化版本。我可以想象添加一个setTimeout并让函数再次调用它自己,但是我不确定我会这样做还是一个好主意,因为它将使函数长时间处于活动状态。有没有办法在任意时间间隔自动重试此计划功能?
exports.fetchData= functions.pubsub
.schedule('every Tuesday 6:00')
.timeZone('America/New_York')
.onRun(async context => {
const response = fetch(...)
.then(res => {
if (res.status < 400) {
return res;
} else {
throw new Error(`Network response was not ok. ${res}`);
}
})
.then(res => res.json());
const resObj = await response;
resObj.map(x => {
// check response for valid data
})
if (// data is valid) {
// save to Firebase
} else {
// retry in 1 hour
}
});
});
答案 0 :(得分:1)
计划的功能仅在您指定的计划上运行。没有“任意”调度。如果您认为该功能可能经常失败,请考虑增加调度的频率,并避免由于最近的成功而不必运行的功能调用。
如果您enable retries,并且该函数通过引发异常,返回被拒绝的承诺或超时而生成错误,则Cloud Functions将按照您无法控制的时间表自动重试该函数。< / p>
setTimeout不是使函数保持活动状态超过其配置的超时时间的可行选项。超时到期后,Cloud Functions将终止该功能及其所有正在进行的工作(您将为该功能处于空闲状态付出时间,这是一种浪费)。