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);
});
}

在 Google Cloud 中,有一种优雅的方法可以为 Cloud Function 中的关键部分提供全局分布式互斥锁:

GCSLOCK

这是一个用Go语言编写的库,因此可用于用Go编写的Cloud Functions,它利用了Google Cloud Storage服务的原子性保证。这种方法显然在 AWS 中不可用,因为 S3 服务中缺乏此类保证。

该工具并非适用于所有用例。获取和释放锁是大约 10 毫秒的操作,这对于高速处理用例来说可能太多了。

对于典型的批处理过程,这不是时间关键型的,该工具提供了非常有趣的选项,可以保证您的云函数不会在同一目标资源上并发运行。只需在 GCS 中创建锁定文件,其名称对于您要放入关键部分的操作是唯一的,并在完成后将其释放(或依靠 GCS 对象生命周期管理来清理锁定)。

请在原始工具 GitHub 项目中查看更多注意事项和优缺点。

显然在Python中也有相同的实现。

这是一篇不错的文章,特别总结了 GCP 上分布式锁定的用例。

这不是要在云函数中实现的模式。 限制云函数的并行性将限制其可伸缩性,这与云函数的工作方式背道而驰。 若要详细了解云函数如何扩展,请观看此视频。

如果数据库需要针对并发访问提供一些保护,则应使用数据库自己的事务功能。 几乎每个提供并发数据访问的数据库也提供了一些执行原子事务的能力。 使用这些事务,让无服务器容器以它认为合适的方式进行扩展和缩减。

最新更新