如何检查 Cloud Functions for Firebase 中的某个代码块是否有实例 运行?

How can I check if there is an instance running for a certain block of code in Cloud Functions for Firebase?

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

我的用例是这样的:

假设从客户端写入实时数据库,导致 Cloud Functions 触发 运行 处理程序。这个处理程序的工作是循环处理客户端刚刚写入的记录快照,使用循环将解析快照中的每条记录,完成后删除它们。处理程序工作得很好,直到在处理程序的工作完成之前将另一条记录写入数据库中的同一组记录,这会导致第二个处理程序线程启动,并开始遍历同一组记录中的记录,这将导致记录被迭代两次,并且可能导致数据被处理两次。

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

提前致谢!

无法跟踪 Cloud Functions 的 运行 个实例 "in-memory",因为每个函数调用可能 运行 在完全不同的虚拟基础设施中。相反,您最有可能想在这里做的是保持某种锁,例如Firebase 实时数据库 using a transaction。所以你会做这样的事情:

  1. 函数调用开始时,随机生成一个"worker ID".
  2. 运行 一个事务,用于检查从您正在处理的文件派生的数据库路径。如果它为空,或填充了早于函数超时的时间戳,请将您的工作人员 ID 和当前时间戳写入该位置。如果它不为空或时间戳是新的,请立即退出您的函数,因为已经有一个活跃的工作人员。
  3. 做你的文件处理。
  4. 运行 如果数据库中的工作人员 ID 仍然与您的工作人员 ID 匹配,则从数据库中删除锁的另一个事务。

这将防止两个函数同时处理同一个文件。但是,这意味着任何在路径锁定时执行的函数都将被丢弃(这可能是您想要的,也可能不是您想要的)。