【问题标题】:How to continue running Firebase Cloud Function after request is finished请求完成后如何继续运行 Firebase Cloud Function
【发布时间】:2021-01-21 19:46:41
【问题描述】:

很奇怪,Firebase 似乎不像典型的 Express 应用那样工作。无论我用 Express 写什么并将其复制粘贴到 Firebase Functions,我通常都会出错。不过有一个我自己也搞不清楚。

此端点旨在启动一项功能并使其寿命足够长以完成更长的任务。该请求是一个 webhook(发送文档,我们将对其进行转换并在完成后对您执行 ping 操作以指定另一个 webhook)。下面是非常简化的示例:

router.post('/', (req, res) => {
  try {
    generateZipWithDocuments(data) // on purpose it's not async so request can return freely
    res.sendStatus(201)
  
  } catch (error) {
    res.send({ error })
  }
})

在我的本地机器上它可以工作(纯 Express 应用程序和本地模拟的 Firebase 函数),但在云中它有问题,即使我放置了 console.log() 的行列,我也没有得到太多信息。 Firebase 没有错误。

【问题讨论】:

    标签: firebase google-cloud-functions


    【解决方案1】:

    如果generateZipWithDocuments()不是异步的,res.sendStatus()会在它之后立即执行,并且云函数将被终止(并且generateZipWithDocuments()所做的工作不会完成)。有关详细信息,请参阅文档here

    你有两种可能:

    1. 您将其设为异步并等待其作业完成,然后再发送响应。您通常会为此使用async/await。请注意,云函数的最长执行时间为 9 分钟。
    2. 您将长时间执行作业委托给另一个 Cloud Function,然后然后发送响应。要将作业委派给另一个 Cloud Functions,您应该使用 Pub/Sub。请参阅Pub/Sub triggersthe sample quickstartthis SO thread,了解有关如何实现它的更多详细信息。在 Pub/Sub 触发功能中,当工作完成后,您可以通过电子邮件、notification、更新您设置了侦听器的 Firestore 文档等方式通知用户...如果 generateZipWithDocuments() 需要很长一段时间,它显然是最用户友好的选择。

    【讨论】:

    • 使用async/await 可能会有点麻烦,因为一些已处理的文档可能需要大约 2GB(想象一下创建了数千个文档)。在这种情况下,我会遇到超时的风险。另一件事是,我希望它能够连接到第三方 API(如 Zapier、Pabbly),所以我还需要让用户能够指定我应该从谷歌云存储(最终文件更新的地方)发送下载链接到哪个端点。多亏了您的链接,我现在正忙于 Pub/Sub
    • 您可以很好地将一些数据从第一个 Cloud Functions 传递到 Pub/Sub 一个,请参阅第三个链接。在任何情况下,如果您在 Cloud Function 中执行作业,您必须使用async/await(或then())才能正确管理 Cloud Function 的生命周期,请参阅第一个链接在我的回答中。
    • 非常感谢!将检查所有这些并在我让它工作后回来。同时:你知道为什么它在本地工作而不做任何 PubSub 机制吗?我想如果它不能在生产中工作,那么本地环境也不应该工作
    • 这些配额也令人困惑:firebase.google.com/docs/functions/quotas - PubSub 函数算作后台函数?如果是这样,在用户发送文件超过 10MB 的情况下,功能将不起作用?抱歉问了这么多问题,文档真的不容易阅读
    • @jeand'arme 见cloud.google.com/functions/docs/writing/background。由于您的新问题与您原来的帖子是分开的,我建议您创建一个关于它的新问题。
    猜你喜欢
    • 1970-01-01
    • 2011-07-21
    • 2019-01-27
    • 2021-04-26
    • 2017-01-17
    • 1970-01-01
    • 1970-01-01
    • 2021-05-07
    • 2016-09-16
    相关资源
    最近更新 更多