我有一个并发调用 N 次的 AWS Lambda 函数,并且在第 N 次调用后我必须触发一个操作。
有关 DynamoDB 原子性/事务性的文档有点混乱:link。
我当前的解决方案(python SDK boto3)是将计数器和条件表达式结合起来:
# Lambda content...
try:
dynamo_table.update_item(
Key={ 'Id' : id },
UpdateExpression="ADD file_processing_count :inc",
ExpressionAttributeValues={':inc': -1, ':min': 1},
ConditionExpression='file_processing_count > :min',
ReturnValues="UPDATED_NEW")
all_file_processed=False
except:
all_file_processed=True
这足以防止竞争条件吗?
DynamoDB 中的所有单例操作都是强序列化和原子性的,因为所有写入均由领导节点处理。因此,您永远不会遇到竞争条件,所有更新都将按照 DynamoDB 收到的顺序应用。