繁体   English   中英

Azure是否有开箱即用的密钥分布式锁定方式?

[英]Does Azure have an out-of-box way of distributed locking with a key?

我希望能够编写像这样的代码

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 租约滚动我自己的键控锁,但是有没有 -钥匙锁的盒子方式?

您可以使用Redis分布式锁。

RedLock.net软件包提供了您所需要的:

var resource = "the-thing-we-are-locking-on";
var expiry = TimeSpan.FromSeconds(30);


using (var redLock = await redlockFactory.CreateLockAsync(resource, expiry)) // there are also non async Create() methods
{
   // make sure we got the lock
   if (redLock.IsAcquired)
   {
    // do stuff
   }
}

是的,它可以通过租用 Blob 功能在 Azure 存储中实现。 Azure Functions 实际上使用此功能在函数的多个实例之间进行协调。

如果我想在x.Id上创建获取锁,我将使用 Azure 存储在路径/my-app-locks/{x.Id}处的 0 字节 blob 上获得 60 秒的存储租用。 如果我得到租约,我就知道我有锁,如果没有,那么其他人就有了,然后我可以轮询它,直到他们释放它。 您也可以在 60 年代租约到期之前续订以延长时间。

这个博客有一些代码和细节,以及其他实现方式 - https://medium.com/@fbeltrao/distributed-locking-in-azure-functions-bc4517c0306c

虽然不是“开箱即用”,但我发现了 2 个 Nuget 包,它们可以使用 Azure Blob 存储租约(以及其他技术)来执行分布式锁。 YMMV:

分布式锁 ( https://github.com/madelson/DistributedLock )

分布式锁 ( https://github.com/davidrevoledo/DistributedLocks )

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM