Firebase云功能触发onCreate和onDelete竞争条件

时间:2018-05-06 22:11:37

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

我分别为onCreate和onDelete事件提供了两个firebase触发器increaseCount和reduceCount。

情景

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

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

问题

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

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

我真的希望能够深入了解这里的最佳实践或任何过去类似情况的经验。

这是我的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;
    }
 }
});

1 个答案:

答案 0 :(得分:2)

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