【问题标题】:Firebase Function can't run setTimeOut in background continuously for Cron JobFirebase 函数无法为 Cron 作业在后台连续运行 setTimeOut
【发布时间】:2018-09-20 02:07:21
【问题描述】:

我想创建一个纯 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 请求,否则它会工作吗?

【问题讨论】:

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


    【解决方案1】:

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

    您甚至没有在您显示的代码中定义适当的云函数,甚至没有记录其效果(并且实际上不受支持)。我很惊讶它可以部署和运行你所展示的任何东西。

    Cloud Functions 仅适用于对 Firebase 产品(或 HTTP 请求)中的更改做出反应的短期工作。如果你想安排工作,你必须带上你自己的调度工具。 another question on Stack Overflow 讨论了一些选项。

    【讨论】:

    • 根据您的反馈和给定的链接,我在Edit 2 中添加了一些关于如何保持服务器唤醒的意见,但我不确定这是否可能。请指教。
    猜你喜欢
    • 1970-01-01
    • 2013-09-24
    • 2017-01-23
    • 2012-01-13
    • 1970-01-01
    • 2015-09-20
    • 2013-10-21
    • 2014-02-02
    • 2012-09-28
    相关资源
    最近更新 更多