如何检查Cloud Functions for Firebase中是否存在针对特定代码块运行的实例?

时间:2017-08-31 19:37:02

标签: javascript multithreading firebase google-cloud-functions

我想知道是否有可能检测到某个线程已经在运行Cloud Functions,并且如果可能的话还可以检测它是否正在运行特定ID的数据。我想我可以将一个变量存储在Firebase数据库中的ID的firebase内存中,该函数正在从数据库运行,并在函数运行完毕后删除该变量,但关注的是对数据库的两次写入随后又非常迅速地发生,导致初始线程无法在第二个线程检查变量是否存在之前足够快地写入内存,尤其是在来自firebase线程的冷启动时 - 在我的理解中是可变量的任何一个线程可能首先旋转的时间。

我的用例是:

让我们说实时数据库的写入发生在客户端,导致云函数的触发器运行处理程序。这个处理程序的工作是遍历并使用客户端刚刚写入的记录快照,并使用循环将解析快照中的每个记录,完成后删除它们。处理程序运行良好,直到在处理程序的作业完成之前将另一条记录写入数据库中的同一组记录,这会导致第二个处理程序线程旋转,并开始在同一组中的记录中移动记录,这将导致记录重复两次,并可能导致数据处理两次。

对于我的特定情况,我有其他解决方案,我可以使用它,但它只涉及允许每条记录像正常情况一样触发一个单独的线程。

提前致谢!

1 个答案:

答案 0 :(得分:1)

无法跟踪正在运行的实例"内存中"对于云函数,因为每个函数调用可能在完全不同的虚拟基础上运行。相反,你最想在这里做的是在某些情况下保持某种锁定。 Firebase实时数据库using a transaction。所以你要做的事情是:

  1. 当函数调用开始时,生成一个随机的"工作者ID"。
  2. 运行事务以检查从您正在处理的文件派生的数据库路径。如果它为空,或者使用早于函数超时的时间戳填充,请将您的工作者ID和当前时间戳写入该位置。如果它不是空的或时间戳是新鲜的,请立即退出您的功能,因为那里已经是活跃的工作人员。
  3. 进行文件处理。
  4. 如果数据库中的工作人员ID仍与您的工作人员ID匹配,则运行另一个从数据库中删除锁的事务。
  5. 这将阻止两个函数同时处理同一个文件。但是,这意味着在路径被锁定时执行的任何函数都将被丢弃(这可能是您想要的,也可能不是。)