Функция Firebase не может непрерывно запускать setTimeOut в фоновом режиме для задания Cron - PullRequest
0 голосов
/ 20 сентября 2018

Я хотел бы создать задание cron только с функциями Firebase.

Ниже приведен мой код:

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.

Похоже, сервер перейдет в "спящий режим" через определенное время.

Я понимаю, что работаеткод в фоновом режиме будет стоить ему квоты процессора, и я в порядке.

Но я хотел бы знать, как сделать так, чтобы он всегда "проснулся"?

Спасибо.

Редактировать 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 не достаточно умны, чтобыизбегать http-запроса от него самостоятельно, иначе это будет работать?

1 Ответ

0 голосов
/ 20 сентября 2018

Реализация надежного задания в стиле cron невозможна только с облачными функциями.Максимально настраиваемое время ожидания всех функций составляет 9 минут (по умолчанию 1 минута).По истечении времени ожидания ваша функция будет закрыта с ошибкой в ​​журнале.

Вы даже не определяете правильную функцию облака в коде, который вы показываете, а последствия этого даже не задокументированы (и фактически не поддерживаются).Я удивлен, что он развертывает и запускает все, что вы показали.

Облачные функции предназначены только для непродолжительной работы, которая реагирует на изменения в ваших продуктах Firebase (или HTTP-запросы).Если вы хотите запланировать работу, вы должны принести свой собственный инструмент планировщика. есть еще один вопрос по переполнению стека , в котором обсуждаются некоторые варианты.

...