我有一个用例,我希望以主动 - 被动模式运行我的应用程序。将运行两个实例,但只有一个将处于活动状态,并且其他将持续等待锁定。
我在项目中使用Dynamodb表,我想基于dynamodb实现锁。我不确定它是如何工作的。
有人可以帮助我理解如何使用锁定dynamodb表来实现这一点吗?
答案 0 :(得分:0)
您正在考虑的DynamoDB中的功能是条件写入。 DynamoDB不支持"锁定"本地,但您可以使用条件写入来实现基于租约或锁定的系统,该系统应该通过使用DynamoDB来实现您想要的目标。
首先要决定是要实现基于租约的系统还是基于锁的系统。主要区别在于,如果租约在一定时间内没有续订,而租约永远不会自动失效,则租约将自动失效。一般而言,在使用分布式系统时,租约在大多数情况下具有更好的特性。例如,如果主节点终止,则备用节点将在租约到期时接管,但如果它是锁,则在另一个系统释放锁之前它不会接管。
基于锁定的系统可以被视为基于租赁的系统的特殊情况,其中租约到期是无限期的,因此我将描述如何在DynamoDB中实现基于租约的系统。
在DynamoDB中实现租赁系统的方法是拥有一个表,该表将包含每个表示不同租约的记录。表格设计可能如下所示:
上述设计假设资源已知为他们试图控制的leaseId。
以下算法概述了服务器获取以下内容所需的操作:
if (not holding lease) then
read record from DynamoDB using leaseId
if (resourceId is not set) then
# lease appears to be available
perform conditional write on leaseId record
# set resourceId to our ID and leaseExpiration to time in future
# with condition that resourceId and leaseExpiration are not set
if (conditional write succeeds) then
# we have the lease!
return true
else
# failed to get the lease
return false
done
else if (leaseExpiration is past)
# lease has expired so lets attempt to take it
perform conditional write on leaseId record
# set resourceId to our ID and leaseExpiration to time in future
# with condition that resourceId and leaseExpiration were values we read earlier
if (conditional write succeeds) then
# we have the lease!
return true
else
# failed to get the lease
return false
done
done
else
# we have the lease, so lets keep it
perform conditional write on leaseId record
# set leaseExpiration to time in future
# with condition that resourceId is equal to our ID
if (conditional write succeeds) then
# we still have the lease!
return true
else
# we lost our lease
return false
done
done
如果整个服务器都受到保护,那么上述算法基本上是在循环中运行的。如果资源具有租约,那么它需要在租约到期之前运行以确保它保留它。如果资源没有租约,它应该等一下再尝试再次获取它。
如果服务器想要放弃锁定,那么它将执行以下算法:
perform conditional write on leaseId record
# erase resourceId and erase leaseExpiration attributes
# with condition that resourceId is equal to our ID
if (conditional write succeeds) then
# we successfully gave up the lease
else
# the lease was not ours to give up
done