AWS Lambda 的竞争条件
Race condition with AWS Lambda
Workflow :我有一个 python AWS lambda 函数,它基本上在 dynamo DB (json) 中查找主机名池并附加其中一个它们到一个实例(旋转起来),然后从发电机数据库中删除该主机名,以免再次用于另一个实例。
问题:实例启动后,它会立即向 SNS 服务发送通知,触发 lambda 从可用主机名中为其分配一个主机名。有时多个实例一起出现并且它们同时触发相同的 lambda 函数(2 个线程)。它们可能是一种竞争条件,其中两个函数都在 dynamo 数据库中查找可用主机名并签署相同的主机名。我该如何解决这个问题?
任何想法?
与其从 DynamoDB 中删除主机名,不如在 DynamoDB 中锁定主机名?如果 DynamoDB 中的每个项目都对应一个唯一的主机名,那么您可以使用如下所示的条件写入,并且仅在尚未获取主机名时才尝试获取该主机名。您以 instanceid 属性为条件
- 未使用的主机名:
{hostname: 'tom-sawyer'}
- UpdateItem 在
{hostname: 'tom-sawyer'}
上执行条件写入,其中条件为 attribute_not_exists(instanceid)
,更新表达式为 SET instanceid = :instanceid
,ExpressionAttributeValues 映射为 {:instanceid: 'deadbeef'}
。基本上,您只允许 DynamoDB 在没有设置 instanceid 时将实例分配给主机名。
- 使用的主机名:
{hostname: 'tom-sawyer', 'instanceid'='deadbeef'}
- UpdateItem 在
{hostname: 'tom-sawyer'}
上执行条件写入,其中条件为 attribute_exists(instanceid) AND instanceid = :instanceid
,更新表达式为 REMOVE instanceid
。基本上,您只允许 DynamoDB un-assign 当要删除的实例 ID 已设置并匹配该主机名的记录时的特定实例。
Workflow :我有一个 python AWS lambda 函数,它基本上在 dynamo DB (json) 中查找主机名池并附加其中一个它们到一个实例(旋转起来),然后从发电机数据库中删除该主机名,以免再次用于另一个实例。
问题:实例启动后,它会立即向 SNS 服务发送通知,触发 lambda 从可用主机名中为其分配一个主机名。有时多个实例一起出现并且它们同时触发相同的 lambda 函数(2 个线程)。它们可能是一种竞争条件,其中两个函数都在 dynamo 数据库中查找可用主机名并签署相同的主机名。我该如何解决这个问题?
任何想法?
与其从 DynamoDB 中删除主机名,不如在 DynamoDB 中锁定主机名?如果 DynamoDB 中的每个项目都对应一个唯一的主机名,那么您可以使用如下所示的条件写入,并且仅在尚未获取主机名时才尝试获取该主机名。您以 instanceid 属性为条件
- 未使用的主机名:
{hostname: 'tom-sawyer'}
- UpdateItem 在
{hostname: 'tom-sawyer'}
上执行条件写入,其中条件为attribute_not_exists(instanceid)
,更新表达式为SET instanceid = :instanceid
,ExpressionAttributeValues 映射为{:instanceid: 'deadbeef'}
。基本上,您只允许 DynamoDB 在没有设置 instanceid 时将实例分配给主机名。 - 使用的主机名:
{hostname: 'tom-sawyer', 'instanceid'='deadbeef'}
- UpdateItem 在
{hostname: 'tom-sawyer'}
上执行条件写入,其中条件为attribute_exists(instanceid) AND instanceid = :instanceid
,更新表达式为REMOVE instanceid
。基本上,您只允许 DynamoDB un-assign 当要删除的实例 ID 已设置并匹配该主机名的记录时的特定实例。