以任意间隔重试Google Cloud功能

时间:2019-11-02 03:17:54

标签: firebase google-cloud-platform google-cloud-functions

我有一个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
        }
    });
});

1 个答案:

答案 0 :(得分:1)

计划的功能仅在您指定的计划上运行。没有“任意”调度。如果您认为该功能可能经常失败,请考虑增加调度的频率,并避免由于最近的成功而不必运行的功能调用。

如果您enable retries,并且该函数通过引发异常,返回被拒绝的承诺或超时而生成错误,则Cloud Functions将按照您无法控制的时间表自动重试该函数。< / p>

setTimeout不是使函数保持活动状态超过其配置的超时时间的可行选项。超时到期后,Cloud Functions将终止该功能及其所有正在进行的工作(您将为该功能处于空闲状态付出时间,这是一种浪费)。