Firebase 云函数跳动器打开"创建"和"删除争用条件"



我有两个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;
}
}
});

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

最新更新