google-cloud-platform - Google Cloud Functions 实现互斥锁的模式是什么
问题描述
我正在使用 https 触发的 Google Cloud Functions 来处理客户端请求以执行数据库写入。数据的结构方式使得大多数并行写入不会导致损坏。
在少数情况下,我需要防止同一项目同时发生多个写入操作。在功能级别上锁定对某些资源的访问的常见模式是什么。我正在寻找一些“类似互斥锁”的功能。
我正在考虑一些外部服务,它可以授予或拒绝对请求函数实例的资源的访问,但是连接开销会很大——每次握手等等。
根据要求添加了一个示例。在这种特定情况下,重组数据以跟踪更新并不是一个合适的解决方案。
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);
});
}
解决方案
这不是您希望在 Cloud Functions 中实现的模式。限制 Cloud Functions 的并行性会限制其可扩展性,这与 Cloud Functions 的工作方式背道而驰。要详细了解 Cloud Functions 如何扩展,请观看此视频。
如果您的数据库需要对并发访问进行一些保护,您应该使用数据库自己的事务功能。几乎每个提供数据并发访问的数据库也提供了一些执行原子事务的能力。使用这些事务,让无服务器容器以它认为合适的方式向上和向下扩展。
推荐阅读
- powershell - 为什么 Powershell 的 Tee-Object 会弄乱我文件的编码?
- node.js - 有没有一种简单的方法可以使用 Node js 从 Git 存储库中获取 JSON 文件?
- java - 千分尺永远不会更新
- xaml - UWP 中的流体布局
- r - 使用 R 中的 Lambert Conformal Conic 投影在 ggplot2 中映射北极/亚北极地区
- python - 使用 Python 根据标签分层文件中的第一列计算行数(不使用 Pandas、Numpy 等)
- swift - Is there any way to Firebase Auth twice in the same App instance?
- java - Eclispe 项目“锁定”
- sql - 如何使用 T-SQL 中同一表中的记录中的数据更新多条记录
- python - 如何使用熊猫查找序列中缺失的日期行?