在Firebase中执行扇形数据的事务处理

在Firebase中执行扇形数据的事务处理,firebase,firebase-realtime-database,nosql,Firebase,Firebase Realtime Database,Nosql,我正致力于创建一个社交网络式的feed,并一直关注Firebase博客上关于在数据库中散播我的“博客帖子”的文章 这很有意义,并且可以很好地使用update()方法与这些帖子交互。然而,我不清楚如何在多个地方以原子方式执行事务 例如,我想添加“喜欢”帖子的功能。如果我把那篇文章放在一个地方,我的代码会是这样的: var postRef = firebaseDB.ref("posts/" + postID + "/likes"); postRef.transaction(function(like

我正致力于创建一个社交网络式的feed,并一直关注Firebase博客上关于在数据库中散播我的“博客帖子”的文章

这很有意义,并且可以很好地使用update()方法与这些帖子交互。然而,我不清楚如何在多个地方以原子方式执行事务

例如,我想添加“喜欢”帖子的功能。如果我把那篇文章放在一个地方,我的代码会是这样的:

var postRef = firebaseDB.ref("posts/" + postID + "/likes");
postRef.transaction(function(likes) {
    return (likes || 0) + 1;
});
出于显而易见的原因,下面的解决方案是而不是原子的

var postRef1 = firebaseDB.ref("posts/" + postID + "/likes");
postRef1.transaction(function(likes) {
    return (likes || 0) + 1;
});

var postRef2 = firebaseDB.ref("user/" + userID + "/posts/" + postID + "/likes");
postRef2.transaction(function(likes) {
    return (likes || 0) + 1;
});

由于事务在ref上运行,我如何才能原子地“喜欢”多个位置的帖子?

对于您的用例,在写入队列任务的节点时,您需要firebase队列

您的扇出发生在worker节点中,您可以在该节点中基于承诺成功/失败构建薪酬模型

队列是保证工作完成并简化客户端代码的唯一方法

参考:

=========


编辑:2017年3月Firebase引入了云功能,现在是实施扇出的推荐方式

除了禁止用户编辑此类字段外,如何将firebase队列(即admin)设置为一次仅处理一个任务。这意味着只有一个正在更新数据,因此没有事务的ned。当然,这是不可扩展的,但它的工作@勒布朗Meneses@MuhammadHassanfirebase队列保证每个排队项目仅由1名工作人员处理一次。这种方法很容易扩展,因为生产者-消费者模型是如何工作的。添加更多的工作人员将水平扩展。我理解,但可能是另一个正在处理另一个任务的工作人员编辑同一个节点,这可能会导致问题。因为我们可以在firebase中的多个路径上运行事务,所以我看到唯一的选择是将工作进程的数量限制为1,这样我们就可以避免事务。您认为呢?写入同一节点意味着您可能对数据建模不正确。系统的每个模块都应该100%独立于其他模块。编写功能应该是可添加的,不需要修改现有功能。随着最近的发布,现在使用Firebase的云函数实现扇出变得更加容易。