使用Node.js在App Engine上长时间运行的流程

时间:2018-08-03 17:02:10

标签: node.js express google-app-engine web-scraping cron

我有一个Node.js Web爬虫,可能需要一个多小时才能运行。尝试在App Engine标准环境上运行会超时。部署它的最佳方法是什么?

此外,它还触发了每天运行一次的cron.yaml,并命中了Express路线。有更好的方法吗?

这是该代码的简化片段。我可以在本地运行它,并将其部署到App Engine。 dlLinkArray中的链接很少,运行良好。但是,如果数量更多(数千个),它似乎无能为力。使用情况报告显示它运行了几秒钟。

const Storage = require('@google-cloud/storage');
const storage = new Storage();

function startDownload(){
    dlLinkArray = [/*Array of objects with URL and Filename {link: 'http://source.com', filename: 'file123456'} */]; //About 10,000 links/files

    var promises = [];

    dlLinkArray.forEach(record =>{ //create array of nested promises
        promises.push(
            uploadFile(bucketName, record.link, record.filename)
            .then((x) => {
                if(x[1].name) //rename file from whatever is on the remote server to a usefull ID
                    return renameFile(bucketName, x[1].name, record.filename + ".pdf"); //renameFile uses storage.file.move to rename, returns a promise
                else
                    return x;
            })
        );
    });

    return Promise.all(promises);
}

function uploadFile(bucketName, fileURL, reName) {
    // Uploads a remove file to the Cloud Storage bucket
    return storage
        .bucket(bucketName)
        .upload(fileURL, {
            gzip: true,
            metadata: {
                cacheControl: 'public, max-age=31536000',
            },
        });
}

/*Express Route*/
app.get('/api/whatever/download', (req, res) => {
    buckets2.startDownload().then(() => console.log("DONE"));

    res.status(200).send("Download Started");
});

1 个答案:

答案 0 :(得分:0)

我怀疑由于请求截止日期可能会出现问题。对于App Engine标准,默认情况下将其设置为60秒。但是,如果您使用manual scaling,则请求在标准环境中最多可以运行24小时。