javascript - Firebase 功能无法在 Cron 作业的后台连续运行 setTimeOut
问题描述
我想创建一个纯 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 函数一起导出,但它太长了,所以我没有放这篇文章。我在上面发布的代码实际上是有效的,只是里面的 console.log cronJob_2min()
被归类到我的 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 请求,否则它会起作用吗?
解决方案
仅使用 Cloud Functions 无法实现可靠的 cron 样式作业。所有函数的最大可配置超时时间为 9 分钟(默认为 1 分钟)。超时后,您的函数将被关闭并在日志中显示错误。
您甚至没有在您显示的代码中定义适当的云函数,甚至没有记录其效果(并且实际上不受支持)。我很惊讶它正在部署和运行你所展示的任何东西。
Cloud Functions 仅适用于对 Firebase 产品(或 HTTP 请求)的更改做出反应的短期工作。如果你想安排工作,你必须带上你自己的调度工具。Stack Overflow 上还有一个问题讨论了一些选项。
推荐阅读
- php - 如何在php中获取搜索结果
- php - 使用 PHP 在 MySQL 中插入图像时出错
- javascript - 如何将 dropzone 放在表单中但仍允许原始表单提交?
- c# - 从 Azure Active Directory 获取 MVC Web App 中的 samAccountName 名称
- haskell-stack - 如何显示`stack haddock`的进度?
- jquery - 当使用 Laravel 取消选择另一个框时,取消选择“全选”复选框。
- php - PHP MariaDB PDO 计算重复值
- javascript - 当元素被另一个元素替换时计数动画
- excel - 汇总成 Mastersheet 后自动排序
- pentaho - 如何在pentaho中将参数“from”添加到sql查询中?