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

时间:2017-01-03 14:50:39

标签: firebase firebase-realtime-database distributed-computing

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

 - List A
  - a
  - b
  - c

 - List B
  - c
  - d

要做到这一点,我会在列表A和B上注意添加,并在添加内容时检查是否存在匹配。

这很有效,但我为单个客户端插入的内容太多了。

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

但是我希望每场比赛只在一台机器上进行,也就是说如果机器1找到匹配,那么机器2也没有必要处理它。

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

我怎么能锁定"确保其他机器在匹配过程开始后不考虑它们的元素?

2 个答案:

答案 0 :(得分:1)

Firebase不提供此类内容的原生支持,此外我还会担心流媒体协议本身缺乏幂等性。如果您订阅某个主题的更新,但节点本身已关闭,则在下一个服务器启动时,您将获得VALUE更新,而不是节点关闭时发生的所有INCREMENTAL更新的集合。

凭借良好的数据结构,您可以“滚动自己的”设施。毕竟,具有任务幂等性和工作人员锁定(如Resque和Celery)的群集感知任务处理器完全没有基本资源(Redis,数据库等)的方式。您将需要添加数据集来管理工作人员锁定,工作人员锁定工作ID,恢复/错误处理设施等。但是,如果您查看他们用来执行此操作的代码,您将很快发现它需要比简单的StackOverflow帖子实现此目的更多的工作。

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

答案 1 :(得分:0)

我会对此采取行动。

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

将此应用于您的用例

- 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时,该节点最初设置为locked:true。搜索列表B,如果找到匹配项,也将其锁定并开始处理。

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

只是一个想法...