我匹配两个列表中的项目,例如此处A的元素c和B的c匹配。然后我做了一些处理,并将匹配的对添加到另一个列表中。
- List A
- a
- b
- c
- List B
- c
- d
要做到这一点,我会在列表A和B上注意添加,并在添加内容时检查是否存在匹配。
这很有效,但我为单个客户端插入的内容太多了。
所以我需要在多台机器上运行我的匹配器以加快速度。
但是我希望每场比赛只在一台机器上进行,也就是说如果机器1找到匹配,那么机器2也没有必要处理它。
我尝试使用atomic commits但是虽然这可以防止多个匹配相互混乱,但匹配仍然会进行两次。
我怎么能锁定"确保其他机器在匹配过程开始后不考虑它们的元素?
答案 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'现在已被锁定,并且只是忽略它们,因为它们的代码不会继续处理锁定的节点。
只是一个想法...