Firebase Function无法为Cron Job在后台连续运行setTimeOut

时间:2018-09-20 02:07:22

标签: javascript firebase google-cloud-functions cron-task

我只想创建仅具有Firebase功能的cron作业。

下面是我的代码:

const functions = require('firebase-functions');
var admin = require('firebase-admin');

var serviceAccount = require('<private_key_path>');

admin.initializeApp({
    credential: admin.credential.cert(serviceAccount),
    databaseURL: 'https://<project_name>.firebaseio.com'
});


cronJob_2min()

function cronJob_2min() {
    console.log('cronjob started')
    setTimeout(function () {
        testTask1()
        cronJob_2min()
    }, 120000);
}

var testTask1Counter = 0
var testTask1Status = true
function testTask1() {
    if (testTask1Status) {
        testTask1Status = false //flag the task is started to avoid re-trigger again before the task is done
        testTask1Counter++
        console.log('testTask1 Executed: ', testTask1Counter)
        testTask1Status = true //flag the task as completed to let next round trigger execute the function
    }

}

我部署它后,它按预期工作,每2分钟执行一次cronJob_2min(),并调用testTask1()函数。但是它只运行大约20分钟,因为日志仅显示计数器直到10。

似乎服务器在一定时间后将进入“睡眠模式”。

我知道在后台运行代码会消耗CPU配额,我对此表示满意。

但是我想知道如何使其始终“清醒”?

谢谢。

编辑1

侧面说明:我的云函数确实与其他onCall函数一起导出,但是它太长了,因此我没有在本文中发表。我在顶部发布的代码实际上是有效的,只是cronJob_2min()中的console.log被归类为我的onCall函数sendEmail之一。

编辑2

是否可以通过这种方式保持唤醒状态?

//Setup the express, middleware, etc... I will skip that code here

router.get('/wakeUp', function (req, res) {
    setTimeout(function () {
        var theUrl = "https://us-central1-<project_name>.cloudfunctions.net/api/wakeUp"
        var xmlHttp = new XMLHttpRequest();
        xmlHttp.onreadystatechange = function () {
            if (xmlHttp.readyState == 4 && xmlHttp.status == 200)
                callback(xmlHttp.responseText);
        }
        xmlHttp.open("GET", theUrl, true); 
        xmlHttp.send(null);

    }, 120000);
    return res.status(200).send('Tata! I am awake! (I suppose)')
})

app.use(router)
exports.api = functions.https.onRequest(app)

除非Firebase Functions足够智能,可以避免自身发出http请求,否则它认为可以正常工作?

1 个答案:

答案 0 :(得分:1)

仅靠Cloud Functions不可能实现可靠的cron样式的工作。所有功能的最大可配置超时为9分钟(默认为1分钟)。超时后,您的函数将被关闭,并在日志中显示错误。

您甚至没有在显示的代码中定义适当的Cloud Function,甚至没有记录(实际上是不受支持的)效果。令我惊讶的是,它完全可以部署和运行您所显示的一切。

Cloud Functions仅用于对Firebase产品(或HTTP请求)中的更改做出反应的短暂工作。如果要安排工作,则必须带上自己的计划程序工具。 another question on Stack Overflow讨论了一些选项。