Как создать список целевых облачных задач http с определенной разницей во времени - PullRequest
0 голосов
/ 27 марта 2020

У меня есть облачная функция firebase для запуска при записи определенного файла в firebase firestore с именем onWriteFile.

Функция onWriteFile создает облачную задачу http для запуска в определенное время в будущем, как показано ниже:

const { CloudTasksClient } = require('@google-cloud/tasks')

exports.onWriteFile = async (event, context) => { 
    const project = 'my-projet'
    const location = 'us-central1'
    const queue = 'on-write-file'

    const tasksClient = new CloudTasksClient()
    const queuePath = tasksClient.queuePath(project, location, queue)

    const url = `https://${location}-${project}.cloudfunctions.net/some-function`

    //here is the core of question
    const timestamp = event.value.fields.timestamp.integerValue
    const json = { id: context.params.id }

    const task = {
        httpRequest: {
            httpMethod: 'POST',
            url,
            body: Buffer.from(JSON.stringify(json)).toString('base64'),
            headers: {
                'Content-Type': 'application/json',
            },
        },
        scheduleTime: {
            seconds: timestamp
        }
    }

    await tasksClient.createTask({ parent: queuePath, task })
};

Для меня это нормально работает.

Но как создать количество задач с разницей в 10 секунд, например, в одной и той же функции onWrieteFile?

1 Ответ

0 голосов
/ 27 марта 2020

Может быть, я подробно описал этот вопрос. Но я решаю проблему следующим кодом:

const { CloudTasksClient } = require('@google-cloud/tasks')

exports.onWriteFile = async (event, context) => { 
    const project = 'my-projet'
    const location = 'us-central1'
    const queue = 'on-write-file'

    const tasksClient = new CloudTasksClient()
    const queuePath = tasksClient.queuePath(project, location, queue)

    const url = `https://${location}-${project}.cloudfunctions.net/some-function`

    const timestamp = event.value.fields.timestamp.integerValue
    const json = { id: context.params.id }

    //given a array to iterable
    const iterable = Array.from(Array(6).keys())

    //for each iteration I go add ten seconds to timestamp
    const TEN_SECONDS = 10

    const promises = iterable.map(async (i) => {
        const seconds = Number(timestamp) + Number(i * TEN_SECONDS)
        const task = {
            httpRequest: {
                httpMethod: 'POST',
                url,
                body: Buffer.from(JSON.stringify(fixtureId)).toString('base64'),
                headers: {
                    'Content-Type': 'application/json',
                },
            },
            scheduleTime: {
                seconds: seconds
            }
        }

        return await tasksClient.createTask({ parent: queuePath, task })
    })

    //then, I will have 6 cloud tasks with 10 seconds of difference
    await Promise.all(promises)
};

Пожалуйста, помогите мне улучшить вопрос и ответ!

И спасибо Дуг Стивенсон за пост на Medium

Это все!

...