Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/google-cloud-platform/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Google cloud platform 谷歌云函数实现互斥的模式是什么_Google Cloud Platform_Google Cloud Functions - Fatal编程技术网

Google cloud platform 谷歌云函数实现互斥的模式是什么

Google cloud platform 谷歌云函数实现互斥的模式是什么,google-cloud-platform,google-cloud-functions,Google Cloud Platform,Google Cloud Functions,我正在使用https触发的Google云函数来处理客户端请求以执行数据库写入。数据的结构使大多数并行写入不会导致损坏 在少数情况下,我需要防止同一项同时发生多个写入操作。在功能级别上锁定对某些资源的访问的常见模式有哪些。我正在寻找一些“类似互斥”的功能 我在考虑一些外部服务,它可以授予或拒绝对请求函数实例的资源的访问,但是连接开销会很大——每次握手等等 根据要求添加了一个示例。在这种特定情况下,重新构造数据以跟踪更新不是合适的解决方案 import * as admin from "fireba

我正在使用https触发的Google云函数来处理客户端请求以执行数据库写入。数据的结构使大多数并行写入不会导致损坏

在少数情况下,我需要防止同一项同时发生多个写入操作。在功能级别上锁定对某些资源的访问的常见模式有哪些。我正在寻找一些“类似互斥”的功能

我在考虑一些外部服务,它可以授予或拒绝对请求函数实例的资源的访问,但是连接开销会很大——每次握手等等

根据要求添加了一个示例。在这种特定情况下,重新构造数据以跟踪更新不是合适的解决方案

import * as admin from "firebase-admin";

function updateUserState(userId: string) {
    // Query current state
    admin
        .database()
        .ref()
        .child(`/users/${userId}/state`)
        .once("value")
        .then(snapshot => {
            return snapshot.val() || 0;
        })
        .then(currentState => 
            // Perform some operation
            modifyStateAsync(currentState)
        )
        .then(newState => {
            admin
                .database()
                .ref()
                .child(`/users/${userId}/state`)
                .set(newState);
        });
}

这不是您希望在云函数中实现的模式。限制云功能的并行性将限制其可伸缩性,这与云功能的工作方式背道而驰。要了解有关云功能如何扩展的更多信息


如果您有一个数据库需要对并发访问进行一些保护,那么您应该使用该数据库自己的事务功能。几乎所有提供数据并发访问的数据库都提供了执行原子事务的能力。使用这些事务,让无服务器容器以其认为合适的方式上下扩展。

我很感激重复常见的事实,但请阅读问题。我在第一句话中强调,这只是一个例外,不是使用函数/lambda的方式。云数据存储或实时数据库不提供执行真实事务的选项,操作包括读写。实时数据库和云Firestore提供适合与云功能一起使用的事务。云功能如何扩展的规则也不例外。听起来您的问题实际上可能是关于这些事务,而不是CF。Realtime Database Admin SDK不提供事务,此外,整个操作包括读和写,在此期间底层数据不应更改。这就是为什么,即使使用不同的数据库,它也不是一个带有事务的任务。这不是真的。与客户端库一样工作的管理SDK。实时数据库中的事务不会锁定数据库。它们是乐观锁,如果数据被另一个事务更改,或者客户端不使用事务更改数据,它们将重试或取消。如果这个并发模型对你不起作用,考虑重构你的数据,或者考虑使用一个不同的数据库。使用一个外部服务来“锁定整个数据库”是一个非常糟糕的想法,并且会影响你的应用程序的规模。这听起来像是一个。如果您显示再现实际问题的最小代码,则更有可能有人帮助您解决具体问题。根据要求,添加了一个更具体的示例。如果您希望基于现有值编写新值,请使用。除此之外:最后两个
then()
子句不返回任何值,因此如果在云函数中运行此代码,它无法知道何时完成对数据库的写入。