AWS Lambda

时间:2017-02-07 18:45:48

标签: python amazon-web-services amazon-dynamodb aws-lambda race-condition

工作流程:我有一个python AWS lambda函数,它基本上在dynamo DB(json)中查找一个主机名池,并将其中一个附加到一个实例(旋转起来)然后删除来自dynamo db的主机名,以便不再用于另一个实例。

问题:只要实例旋转,它就会向SNS服务发送通知,触发lambda从可用主机名为其分配主机名。有时多个实例出现在一起,它们同时触发相同的lambda函数(2个线程)。它们可能是竞争条件,其中两个函数都在查看dynamo db以获取可用的主机名并签署相同的主机名。我该如何解决这个问题?

任何想法

1 个答案:

答案 0 :(得分:2)

为什么不在DynamoDB中锁定主机名,而不是从DynamoDB中删除主机名?如果DynamoDB中的每个项目都对应一个唯一的主机名,那么您可以使用如下所示的条件写入,并且只有在尚未获取主机名时才尝试获取主机名。您对instanceid属性的条件

  1. 未使用的主机名:{hostname: 'tom-sawyer'}
  2. UpdateItem在{hostname: 'tom-sawyer'}上进行条件写入,条件为attribute_not_exists(instanceid),更新表达式为SET instanceid = :instanceid,ExpressionAttributeValues映射为{:instanceid: 'deadbeef'}。基本上,您只允许DynamoDB在没有设置instanceid的情况下将实例分配给主机名。
  3. 使用的主机名:{hostname: 'tom-sawyer', 'instanceid'='deadbeef'}
  4. UpdateItem在{hostname: 'tom-sawyer'}上进行条件写入,条件为attribute_exists(instanceid) AND instanceid = :instanceid且更新表达式为REMOVE instanceid。基本上,您只允许DynamoDB在设置被删除的实例ID时取消分配特定实例,并匹配该主机名的记录。