gpt4 book ai didi

database - Cloud Firestore 文档锁定

转载 作者:太空狗 更新时间:2023-10-30 01:53:44 26 4
gpt4 key购买 nike

要确保在共享设置中独占使用 Cloud Firestore 文档,在事务中读取然后写入字段(例如“lockedBy”)是否足够?

最佳答案

悲观与乐观

Cloud Firestore 中没有原生独占锁定。由于该系统设计用于在大型分布式系统(例如,数千个手机用户或 Kubernetes 集群)中运行,因此它基于乐观锁定模式。

这意味着当您执行读写事务时,如果您读取的文档在您提交事务之前被写入,则事务将失败,以便客户端可以回滚。

构建您自己的 - 移动 SDK 和安全规则

我假设您是从移动 SDK 入手,并将在下一节介绍服务器客户端。

您可以使用单独的文档在此基础上构建独占锁。例如,假设您要对集合 critical_data 中的文档实现独占锁定。 .

为此,我们将使用一个名为 mutex_critical_data 的单独集合,其中的文档是集合 critical_data 中具有相同 ID 的文档的互斥锁.

在您可以访问名为 doc_id 的文档之前在 critical_data你会想要执行写入事务来设置互斥字段 owner给你。我假设您使用的是 Firebase Auth,所以您 == 用户的身份验证 ID auth_id .不过,这可以是唯一标识用户或进程的任何 ID。

完成文档后,删除互斥文档以便其他人可以使用它。

为确保它是专有的并且其他人无法窃取它,您需要在安全规则定义中添加一些检查。

// In the match section that sets the document id to 'doc_id'
function mutex_exists ()
{
return exists(/databases/$(database)/documents/mutex_critical_data/$(doc_id));
}

function mutex_owner ()
{
return get(/databases/$(database)/documents/mutex_critical_data/$(doc_id)).data;
}

function user_owns_mutex () {
return mutex_owner().owner == request.auth.uid;
}

allow write: if not(mutex_exists()) || user_owns_mutex;

您还可以使用规则来强制执行互斥锁,方法是通过同时拥有互斥锁来预测对资源的写入。

构建您自己的 - 服务器客户端

请记住,安全规则适用于移动/Web SDK 访问,不适用于服务器客户端。由于服务器客户端被认为是受信任的环境,而不是通过规则强制执行排他性逻辑,因此您需要在互斥锁上的读写事务中进行检查。

租赁而非锁定

最后一点,如果您要构建它,我强烈建议您查看独占租约而不是独占锁。

租约就像一把锁,但如果承租人没有(或不允许)在设定的时间之前续租,它会自动到期。这意味着如果客户端没有回来(例如,客户端崩溃),其他人最终将能够在没有管理员操作的情况下获得租约。

概念是一样的,但不是只设置所有者,您还可以在一个字段中设置租用时间。如果租约大于 x老,哪里x是租约的时间长度,它被认为不再被所有者持有。在租约到期之前,您可以选择允许所有者通过设置新的租约时间来续租。

关于database - Cloud Firestore 文档锁定,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47026295/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com