【问题标题】:Performing transactions of fanned-out data in Firebase在 Firebase 中执行扇出数据的事务
【发布时间】:2017-08-26 10:04:35
【问题描述】:

我正在努力创建一个社交网络式的提要,并且一直在关注 Firebase 博客上的 guide,以便在整个数据库中散布我的“博客文章”。

这很有意义,并且可以很好地使用 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 firebase-realtime-database nosql


    【解决方案1】:

    对于您的用例,在写入队列任务的节点时,您需要带有 throttle on the client 的 firebase-queue。

    您的扇出发生在工作节点中,您可以在其中基于承诺成功/失败构建补偿模型。

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

    参考:ways to live without transactions

    =========

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

    【讨论】:

    • 除了禁止用户编辑此类字段之外,如何将 firebase 队列(管理员)设置为一次仅处理 1 个任务。这意味着只有一个在更新数据,因此不需要事务。当然,这没有太大的可扩展性,但它确实有效。 @Leblanc Meneses
    • @MuhammadHassan firebase-queue 保证每个排队的项目将仅由 1 个工作人员处理一次。由于生产者-消费者模型的工作原理,这种方法很容易扩展。添加更多工人将横向扩展。
    • 我了解,但可能是另一名正在处理另一项任务的工作人员编辑同一节点,这可能会导致问题。由于我们可以在 firebase 的多个路径上运行事务,我看到唯一的选择是将工作人员的数量限制为 1,这样我们就可以避免事务。你怎么看?
    • 写入同一个节点意味着您可能对数据建模不正确。系统的每个模块都应该 100% 独立于其他模块。编写功能应该是附加的,不需要修改您现有的功能。随着最近的公告,现在可以更轻松地使用 Firebase 的云功能实现扇出。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-05-04
    • 1970-01-01
    • 2014-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多