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

标签 javascript multithreading firebase google-cloud-functions

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

我的用例是这样的:

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

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

提前致谢!

最佳答案

无法跟踪云函数“内存中”运行的实例,因为每个函数调用可能在完全不同的虚拟基础设施中运行。相反,您最有可能在这里做的是保留某种类型的锁,例如Firebase 实时数据库 using a transaction 。所以你会做类似的事情:

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

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

关于javascript - 如何检查 Cloud Functions for Firebase 中是否有某个实例正在运行某个代码块?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45988893/

相关文章:

node.js - snapshot.val() 返回 null,而有数据

winforms - System.Windows.Threading.Dispatcher 和 WinForms?

c# - 使用 async/await 对大型 C# 应用程序进行多线程处理

android - 如何通过 CURL 向所有设备发送 Firebase 通知?

javascript - Firestore 安全规则 - 不通过身份验证或写入 (resource.data) 将数据传递到 Firestore

c# - Silverlight - 是否可以在后台线程上创建 UI 元素?

javascript - Knockout 中的简单字符串替换

javascript - 每次调用弹出窗口时,jQuery/js 都会存储/附加变量,但为什么呢?

javascript - 如何使用 AngularJS 将对象插入数组

javascript - Bootstrap Scrollspy 导致 Off-Canavas 菜单出现问题