Azure 队列中基于租约和基于锁的独占访问之间的区别

Posted

技术标签:

【中文标题】Azure 队列中基于租约和基于锁的独占访问之间的区别【英文标题】:Difference between Lease-Based and Lock-Based exclusive access in Azure Queues 【发布时间】:2015-03-20 09:00:48 【问题描述】:

我知道(阅读 msdn 文档here)Windows Azure 存储队列对消息使用基于租约的独占访问策略,而 Azure 服务总线队列使用基于锁的策略。 在两者中,我都可以设置锁定/租赁的最长持续时间。那么,这两种方法之间最重要的区别是什么?有人可以提供一个清晰/简短的例子吗? 谢谢。

【问题讨论】:

【参考方案1】:

我的理解是,基于租约有时间限制,而基于锁则没有。

例如,一个租约的期限可以长达 30 秒,在当前用户释放它或期限到期之前,其他人无法获得该租约来访问该资源。但是 30 多岁之后,任何人都可以得到它并访问该资源。 (当然,您可以将持续时间设置为无限。)

对于基于锁的,如果当前用户没有释放锁,没有人可以得到锁。

【讨论】:

感谢@nop 的回复,但我认为这不是真的。服务总线队列使用基于锁的机制,并且还有一个锁超时时间(默认为 60 秒)。【参考方案2】:

Managing Concurrency in Windows Azure with Leases

@nop 的回答是正确的。

租约具有自动超时功能,因此如果持有资源的服务死亡,资源在设置超时后被释放,避免了死锁的情况。它们还具有更新功能。

【讨论】:

nop 的回答不正确——他们都有超时; outlookrperson 对 nop 答案的评论是正确的

以上是关于Azure 队列中基于租约和基于锁的独占访问之间的区别的主要内容,如果未能解决你的问题,请参考以下文章

AQS (Abstract Queued Synchronizer)源码解析 -- 独占锁与共享锁的加锁与解锁

Java Review - 并发编程_抽象同步队列AQS

ReentrantLock (独占锁、互斥锁)

Java Review - 并发编程_抽象同步队列AQS

基于zookeeper和quartz实现分布式定时调度

AQS 原理解析以及源码分析