Firebase:确保使用多个工作人员只执行一次操作

Firebase: Making sure an action is performed only once using multiple workers

我正在匹配两个列表中的项目,例如这里 A 的元素 c 和 B 的 c 将匹配。然后我做一些处理并将匹配的对添加到另一个列表中。

 - List A
  - a
  - b
  - c

 - List B
  - c
  - d

为了做到这一点,我在列表 A 和 B 上观察添加,并在添加内容时检查是否存在匹配项。

这很好用,但我有太多的插入内容供单个客户使用。

所以我需要 运行 在多台机器上使用我的匹配器来加快速度。

但我希望每个匹配只在一台机器上发生,即如果机器 1 找到匹配,机器 2 也没有必要处理它。

我尝试使用 atomic commits 但是虽然这可以防止多个匹配相互混淆,但匹配仍然进行了两次。

我如何 "lock" 元素来确保其他机器在匹配过程开始后不考虑它们?

Firebase 不提供对此类内容的原生支持,另外我担心流式传输协议本身缺乏幂等性。如果您订阅了某个主题的更新,但节点本身死了,那么在您的下一次服务器启动时,您将获得一个 VALUE 更新,而不是您的节点关闭时发生的所有增量更新的集合。

有了良好的数据结构,您就可以 "roll your own" 这样的设施。毕竟,像 Resque 和 Celery 这样具有任务幂等性和 worker 锁定的集群感知任务处理器在基本资源(Redis、DB 等)的方式上确实做到了这一点。您将需要添加数据集来管理 worker锁定、工作人员锁定作业 ID、recovery/error 处理设施等。但是,如果您查看他们用于执行此操作的代码,您很快就会发现它需要比简单的 Whosebug post 管理更多的工作实现这一目标。

作为替代方案,为什么不考虑使用 ActionHeroJS 等堆栈作为集群感知 API 层?它具有 Redis 支持的集群机制和基于 Resque 的任务管理,可以满足您的所有需求,并且与 Firebase 搭配得非常好...

我会试一试。

我们的应用程序有用户并且可以编辑一些用户数据 - 但是,我们不希望同时在多个客户端上编辑用户数据。所以我们实现了一个简单的锁定机制,通知客户端用户在编辑时被锁定。

将此应用于您的用例

- List A
  -Yiuiaisida9  //node names created with childByAutoId
     letter: "a"
     isLocked: false
  -YJI99s9ajsl
     letter: "b"
     isLocked: false
  -YE9jsiakskk
     letter: "c"
     isLocked: true

 - List B
  -YJ0a0s0kdka
     letter: "c"
     isLocked: true
  -YM0s09s0ksk
     letter: "d"
     isLocked: false

因此您的客户端都观察到列表 A 和列表 B。当一个子节点添加到列表 A 时,该节点最初设置为锁定:true。搜索列表 B,如果找到匹配项,也将其锁定并开始处理。

其他客户端将收到通知 'c' 现在已被锁定,并且会简单地忽略它们,因为它们的代码不会继续处理锁定的节点。

只是一个想法...