c# - Azure 是否具有使用密钥进行分布式锁定的开箱即用方式?
问题描述
我希望能够编写类似的代码
using (await LockAsync(x.Id))
{
// here goes code that is unsafe with respect to x.Id
// because it can be executed in multiple threads on
// the same instance or on multiple instances (e.g.
// multiple Azure Functions
}
我知道有一些开箱即用的方法可以在不使用密钥的情况下(例如[ActivityTrigger]
在函数中)锁定整个执行上下文,并且我知道我可以使用 blob 租约滚动我自己的键控锁,但是是否有一种开箱即用的方法钥匙锁?
解决方案
是的,它在 Azure 存储中具有租赁 Blob 功能。Azure Functions 实际上使用此功能在函数的多个实例之间进行协调。
如果我想创建获取锁,x.Id
我会使用 Azure 存储在 path 的 0 字节 blob 上获取 60s 存储租约/my-app-locks/{x.Id}
。如果我得到了租约,我知道我有锁,如果没有,那么其他人会这样做,然后我可以轮询它,直到他们释放它。您也可以在 60 年代租约到期前续订以延长时间。
该博客包含一些代码和详细信息,以及其他实现方式 - https://medium.com/@fbeltrao/distributed-locking-in-azure-functions-bc4517c0306c
推荐阅读
- sql - 在一个单元格中存储多个值,然后将它们绑定到另一个表
- html - 直接链接到 HTML 文本
- c - 客户端代码无法从服务器 [sockets] 读取数据
- javascript - 在javascript中访问嵌套数组?
- sql-server - SSRS:试图隐藏文本框并不断收到数据聚合错误
- java - 将表中的所有行作为 Flux 阻塞或锁定在 R2DB 中处理?
- javascript - sequelize nodejs 返回应该在当前时间显示的数据
- node.js - 为什么我的字符串插值不适用于 URL?
- sql - 在 SQL 中创建多个数据透视字段
- javascript - 创建订阅条带失败的node.js