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
1
1770 - 3538
2
3539 - 5307
3
5308 - 7076
4
7077 - 8845
5
8846 - 10240
6
例如,您可以将 Lambdas 内存增加到 2000MB 并检查这是否会提高性能。
此外,我绝对建议使用批处理操作,而不仅仅是 GetItem
。
我正在尝试使用 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 | 1 |
1770 - 3538 | 2 |
3539 - 5307 | 3 |
5308 - 7076 | 4 |
7077 - 8845 | 5 |
8846 - 10240 | 6 |
例如,您可以将 Lambdas 内存增加到 2000MB 并检查这是否会提高性能。
此外,我绝对建议使用批处理操作,而不仅仅是 GetItem
。