使用DynamoDB锁的主动 - 被动应用程序

时间:2015-12-02 05:58:08

标签: amazon-web-services locking amazon-dynamodb

我有一个用例,我希望以主动 - 被动模式运行我的应用程序。将运行两个实例,但只有一个将处于活动状态,并且其他将持续等待锁定。

我在项目中使用Dynamodb表,我想基于dynamodb实现锁。我不确定它是如何工作的。

有人可以帮助我理解如何使用锁定dynamodb表来实现这一点吗?

1 个答案:

答案 0 :(得分:0)

您正在考虑的DynamoDB中的功能是条件写入。 DynamoDB不支持"锁定"本地,但您可以使用条件写入来实现基于租约或锁定的系统,该系统应该通过使用DynamoDB来实现您想要的目标。

首先要决定是要实现基于租约的系统还是基于锁的系统。主要区别在于,如果租约在一定时间内没有续订,而租约永远不会自动失效,则租约将自动失效。一般而言,在使用分布式系统时,租约在大多数情况下具有更好的特性。例如,如果主节点终止,则备用节点将在租约到期时接管,但如果它是锁,则在另一个系统释放锁之前它不会接管。

基于锁定的系统可以被视为基于租赁的系统的特殊情况,其中租约到期是无限期的,因此我将描述如何在DynamoDB中实现基于租约的系统。

在DynamoDB中实现租赁系统的方法是拥有一个表,该表将包含每个表示不同租约的记录。表格设计可能如下所示:

  • leaseId(哈希键)
  • resourceId(仅在租约被分配给谁持有时才设置)
  • leaseExpiration(仅在分配租约时设置;租约到期时的时间戳)

上述设计假设资源已知为他们试图控制的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