首页 > 解决方案 > 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 租约滚动我自己的键控锁,但是是否有一种开箱即用的方法钥匙锁?

标签: c#azurelockingazure-functionsazure-webjobs

解决方案


是的,它在 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


推荐阅读