我正在使用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);
});
}
这不是您要在云功能中实现的模式。限制云函数的并行性将限制其可伸缩性,这与云函数的工作方式相反。要了解有关云功能如何扩展的更多信息,请访问watch this video。
如果您的数据库需要具有一些防止并发访问的保护,那么您应该使用数据库自己的事务功能。几乎每个提供数据并发访问的数据库也提供了执行原子事务的能力。使用这些事务,让无服务器容器以其认为合适的方式向上和向下扩展。