假设我有一个Cloud Firebase Function - 由一个cron作业调用 - 每次调用时都会产生30多个任务。
这些任务非常缓慢(平均每次5到6秒),我无法直接处理它们,因为它会超时。
因此,解决方案是在每个任务中调用另一个“worker”函数,以独立完成任务并将结果写入数据库。到目前为止,我可以想到三个策略:
Pubsub消息。这将是惊人的,但它似乎you can only listen on pubsub messages from within a Cloud Function,而不是创建一个。求助于外部解决方案,例如拥有GAE实例,对我来说不是一个选择。
从第一个调用工作人员http触发的Firebase云功能。我认为这不会起作用,因为我需要等待所有被调用的工作函数的响应,在它们完成后send
,并且我的原始函数将超时。
将任务附加到实时数据库列表,然后具有由每个数据库更改触发的工作程序功能。之后,工作人员必须从队列中删除该任务。这可能会奏效,但感觉有一个简单的问题有很多活动部分。例如,如果工人抛出怎么办?需要另一个“清理”数据库的cron等。
我想到的另一个解决方案是firebase-queue,但它的README明确指出:
“firebase-queue可能会继续存在特定的用例, 但是,如果您正在寻找通用的,可扩展的排队 Firebase的系统很可能建立在Google之上 Firebase的云功能是理想的路线“
它没有得到官方支持,他们实际上说我们应该使用函数(这是我正在尝试做的)。我有点紧张使用可能会在明天放弃的图书馆(如果还没有),并且希望避免沿着这条路走下去。
答案 0 :(得分:7)
云功能在相当标准的Node.js环境中运行。鉴于Node / NPM生态系统的广度,您可以在云功能中执行的操作非常广泛。
您似乎只能在Cloud Function中侦听pubsub消息,而不是创建一个
您可以使用Pub / Sub的常规Node.js模块从Cloud Functions中向Pub / Sub主题发布新消息。请参阅Cloud Pub/Sub documentation for an example。
这也是一种相当常见的模式。在将结果写回数据库的同一时刻,我通常会让我的子进程/工作人员自行清理。这在我的简单场景中运行良好,但您的里程当然可能会有所不同。
如果你有一个具体的清理问题,请发布重现问题的代码,我们可以看看如何使其更加健壮。