如何从 Cloud Functions 调用其他 Cloud Firebase Functions

How to invoke other Cloud Firebase Functions from a Cloud Function

假设我有一个 Cloud Firebase Function - 由 cron 作业调用 - 每次调用时都会产生 30 多个任务。

这些任务非常慢(平均每个任务 5 - 6 秒),我无法直接在原始文件中处理它们,因为它会超时。

因此,解决方案是调用另一个 "worker" 函数,每个任务调用一次,以独立完成任务并将结果写入数据库。目前我能想到三种策略:

  1. 发布订阅消息。那将是惊人的,但似乎 you can only listen on pubsub messages from within a Cloud Function,而不是创建一个。求助于外部解决方案,例如拥有 GAE 实例,对我来说不是一个选择。

  2. 从第一个调用 worker http 触发的 Firebase 云函数。我认为那是行不通的,因为我需要等待所有调用的辅助函数的响应,在它们完成并且 send 之后,我的原始函数将超时。

  3. 将任务追加到实时数据库列表,然后有一个由每个数据库更改触发的辅助函数。工作人员必须事后从队列中删除任务。这可能会奏效,但感觉一个简单的问题有很多变化的部分。例如,如果工人抛出怎么办? "clean" 需要数据库的另一个 cron 等等

想到的另一个解决方案是 firebase-queue,但其 README 明确指出:

"There may continue to be specific use-cases for firebase-queue, however if you're looking for a general purpose, scalable queueing system for Firebase then it is likely that building on top of Google Cloud Functions for Firebase is the ideal route"

它没有得到官方支持,他们实际上是在说我们应该改用 Functions(这正是我正在尝试做的)。我对在 prod 中使用明天可能会被遗弃的库(如果还没有的话)感到有点紧张,我想避免走这条路。

正在从 Cloud Functions 发送 Pub/Sub 消息

Cloud Functions 运行 在相当标准的 Node.js 环境中。鉴于 Node/NPM 生态系统的广度,您可以在 Cloud Functions 中执行的操作非常广泛。

it seems that you can only listen on pubsub messages from within a Cloud Function, not create one

您可以使用 Pub/Sub 的常规 Node.js 模块从 Cloud Functions 中向 Pub/Sub 主题发布新消息。见 Cloud Pub/Sub documentation for an example.

通过数据库写入从 Cloud Functions 触发新操作

这也是一种相当常见的模式。我通常让我的 subprocesses/workers 在他们将结果写回数据库的同时自行清理。这在我的简单场景中工作正常,但你的里程当然可能会有所不同。

如果您有具体的清理问题,post 重现该问题的代码,我们可以看看如何让它更健壮。