AWS Lambda Boto3 DynamoDB 并发

AWS Lambda Boto3 DynamoDB Concurrency

我正在尝试使用 concurrent.futures 从 AWS DynamoDB 异步检索项目以缩短函数时间。

def retrieve_dynamo_item(dynamo_tablename, key):
    dynamodb = boto3.resource('dynamodb')
    dynamo_table = dynamodb.Table(dynamo_tablename)
    dynamo_result = dynamo_table.get_item(Key=key)
    return dynamo_result.get('Item')

def lambda_handler(event, context):

    dynamo_queries = ## code
    with concurrent.futures.ThreadPoolExecutor(max_workers=5) as executor:
        futures = [executor.submit(retrieve_dynamo_item, dynamo_table, key) for dynamo_table, key in dynamo_queries]

    final_result = []
    for f in concurrent.futures.as_completed(futures):
        if f.result():
            final_result += f.result().get('result')

然而,在部署和测试 lambda 函数时,性能似乎没有提高,实际上比 运行 同步查询更差。关于可能的原因有什么建议吗?

并行执行最有可能受到函数可用计算能力的影响。使用默认内存分配,您没有太多 CPU。有关更多详细信息,请参阅此

正如 Oleksii 所说,Lambda 的默认内存设置只会给你 1 CPU。所以并发很难实现。性能较慢可能是由于处理线程等增加了开销。

下面的table包含目前内存到CPU个核心的映射(将来可能会改变)。

Memory CPU cores
128 - 1769
1770 - 3538
3539 - 5307
5308 - 7076
7077 - 8845
8846 - 10240

例如,您可以将 Lambdas 内存增加到 2000MB 并检查这是否会提高性能。

此外,我绝对建议使用批处理操作,而不仅仅是 GetItem