Amazon web services 使用asyncio和aioboto3进行DynamoDB写入时没有看到性能改进

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,我对异步概念还不熟悉,所以如果我在这里完全不熟悉,或者有更好的方法来提高性能,

我试图改进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()
完成,然后再发送下一条消息。