Amazon web services 使用asyncio和aioboto3进行DynamoDB写入时没有看到性能改进
我试图改进lambda函数的性能,该函数用于将数千项写入dynamoDB表。我遇到了一个使用aiboto3库进行异步写入的建议,但我没有看到当前实现的改进(请参阅下面的简化代码) 我发现了一个类似的问题(),但它与dynamoDB写入无关,我认为在我的例子中,事件循环没有被重载,因为batch_writer发送25个批,所以即使是10000次写入,也只会发送400个批 这是我第一次使用aioboto3/asyncio,我对异步概念还不熟悉,所以如果我在这里完全不熟悉,或者有更好的方法来提高性能,请告诉我。任何朝正确方向的轻推都将不胜感激Amazon web services 使用asyncio和aioboto3进行DynamoDB写入时没有看到性能改进,amazon-web-services,aws-lambda,amazon-dynamodb,python-asyncio,aio,Amazon Web Services,Aws Lambda,Amazon Dynamodb,Python Asyncio,Aio,我试图改进lambda函数的性能,该函数用于将数千项写入dynamoDB表。我遇到了一个使用aiboto3库进行异步写入的建议,但我没有看到当前实现的改进(请参阅下面的简化代码) 我发现了一个类似的问题(),但它与dynamoDB写入无关,我认为在我的例子中,事件循环没有被重载,因为batch_writer发送25个批,所以即使是10000次写入,也只会发送400个批 这是我第一次使用aioboto3/asyncio,我对异步概念还不熟悉,所以如果我在这里完全不熟悉,或者有更好的方法来提高性能,
async def putMessages(msgs):
async with aioboto3.resource('dynamodb', region_name='us-east-1') as dynamo_resource:
table = await dynamo_resource.Table('Messages')
async with table.batch_writer() as dynamo_writer:
for msg in msgs:
await dynamo_writer.put_item(Item= {
'msgID': msg['msgID'],
'msgType' : msg['msgType']
}
)
def lambda_handler(event, context):
msgs = getMessages()
loop = asyncio.get_event_loop()
loop.run_until_complete(putMessages(msgs))
编辑06.27.2020:通过在未来列表上使用asyncio.gather,在性能方面有了很大的改进。。。但现在我遇到了一个问题,只有一些作者能够成功。在不同的卷上进行了测试,并看到了约6000/10000、~3000/4000、~400/500的写入成功结果。我也不认为这是因为写限制。。。增加了我的写入容量单位,并看到了零节流的类似结果。你知道是什么引起的吗?以下是更新的代码: 编辑06.27.2020:
我又看了一眼cloudwatch指标,意识到即使增加了WCU,实际上也存在一些限制。但配置的容量从未超过,我不认为这可能是一个热分区问题,因为配置的WCU小于每个分区1000的限制。。。所以我不确定这里发生了什么
async def putMessages(msgs):
async with aioboto3.resource('dynamodb', region_name='us-east-1') as dynamo_resource:
table = await dynamo_resource.Table('Messages')
async with table.batch_writer() as dynamo_writer:
writes = []
for msg in msgs:
future = asyncio.ensure_future(
dynamo_writer.put_item(Item= {
'msgID': msg['msgID'],
'msgType' : msg['msgType']
}))
writes.append(future)
await asyncio.gather(*writes)
def lambda_handler(event, context):
msgs = getMessages()
loop = asyncio.get_event_loop()
loop.run_until_complete(putMessages(msgs))
我不是JavaScript程序员,但看起来您正在等待
dynamo\u writer.put\u item()
完成,然后再发送下一条消息。