【问题标题】:Firebase cloud function tiggers onCreate and onDelete race conditionFirebase 云函数触发 onCreate 和 on Delete 竞争条件
【发布时间】:2018-10-16 17:12:18
【问题描述】:

我有两个 Firebase 触发器 increaseCount 和 reductionCount 分别用于 onCreate 和 onDelete 事件。

场景

当用户喜欢客户端上的某些内容时,会在 firebase 数据库中创建一个新路径,并且会触发 onCreate 触发器。然后计数会像我预期的那样递增。

当用户“不喜欢”客户端上的某些内容时,firebase 数据库中的路径会被删除,并且会触发 onDelete 触发器。然后计数递减。

问题

当用户很快喜欢某样东西然后又不喜欢某样东西时,创建新路径和删除现有路径的请求几乎同时发送到 Firebase。

有时 onDelete 触发器会在 onCreate 触发之前触发。

我真的很想了解这里的最佳做法或任何人过去遇到类似情况的经历。

这是我的 onCreate 和 onDelete 函数的淡化版本

exports.increaseCount = functions.database.instance(dbInstance).ref('/path/to/existingPath')
.onCreate((snap, context) => {
 ref.transaction(function(count) {
    return (count || 0) + 1;
 }
});

exports.decreaseCount = functions.database.instance(dbInstance).ref('/path/to/newPath').onDelete((change, context) => {
dbRef.transaction(function(count) {
    if(count && (count > 0)){    
        var newCount = count - 1;
        return newCount;
    } else {
        return 0;
    }
 }
});

【问题讨论】:

    标签: firebase firebase-realtime-database google-cloud-functions


    【解决方案1】:

    这并不是真正的竞争条件。您应该预料到 Cloud Functions 触发器可能会无序触发。这是因为不同的功能可能在不同的服务器实例上运行,并且它们无法以某种方式共享事件排序感。这意味着您可能需要对事务进行一些额外的检查,以确保您的数据库处于对当前函数调用可操作的状态。

    【讨论】:

      猜你喜欢
      • 2018-09-14
      • 2017-09-17
      • 2020-12-11
      • 2010-12-22
      • 1970-01-01
      • 1970-01-01
      • 2016-11-09
      • 2020-07-12
      • 2020-06-12
      相关资源
      最近更新 更多