python - 从 Lambda 调用 DynamoDB BatchGetItem 具有 >1000 毫秒的延迟。正常吗?
问题描述
我正在做 POC 以了解 DynamoDB 的速度。我试图解决的示例问题如下:
我在输入上有 100 个键。对于每个键,我必须查找相关信息。每个键的相关信息约为 8kB。
我已将密钥及其相关信息存储到 DynamoDB 表中test_table
,并将容量设置为按需模式。我从 AWS Lambda 函数中获取信息。该表和 Lambda 位于同一地区(欧盟法兰克福)。这是获取给定密钥列表信息的代码示例:
key_list = [
'key0',
# ...
'key99'
]
dynamo_client = boto3.client('dynamodb')
response = dynamo_client.batch_get_item(
RequestItems={
'test_table': {
'Keys': [
{
'key': {'S': k}
} for k in key_list
],
'ConsistentRead': False
}
}
)
我总是运行 Lambda 几次以确保它已经预热。当我第一次做这个测试时,大约需要 2000 毫秒。我的期望是在大约 500 毫秒内得到这个。我为加快速度所做的事情:
- 将 Lambda 内存从 1GB 增加到最大 (~3GB)。我到了~1300ms。在 Lambda 上,内存越多,带宽就越多,所以我想这就是它变得更快的原因。
- 我在 DynamoDB (1000) 中配置了大读取容量,以查看自动缩放是否不会减慢速度。我没有看到可衡量的效果。
- 我检查了 DynamoDB 表的 CloudWatch 指标,延迟约为 180 毫秒。这很好,所以看起来这不是 DynamoDB 问题。
- 我安装了 aws x-ray sdk 来检查 lambda 端是否有什么东西减慢了速度。调用从
batch_get_item
~1300ms 中占用 ~1250ms,其余的是 lambda 初始化。所以我的猜测是减速一定发生在 Lambda 和 DynamoDB 之间 - 我已将 Lambda 放入 VPC 并为 DynamoDB 使用了服务端点——它没有可测量的效果。
- 我已经将代码放到了一个网络带宽尽可能多的 EC2 实例中(100 Gigabit),它花费了大约 900 毫秒。还是不好。
所以我的猜测是瓶颈在 Lambda 和 DynamoDB 表之间。
我没有尝试过 DAX,因为它涉及到集群的一些额外成本,而且我不确定它是否会有所帮助,因为 DAX 承诺会加快 DynamoDB 方面的速度,这似乎不是瓶颈。
我的问题是:从 DynamoDB 到 Lambda 大约 8MB 需要 >1000 毫秒,这有点正常吗?还是我做错了什么?
解决方案
推荐阅读
- ansible - 将对象列表(字符串,字符串)转换为字典(字符串,列表
) 在 Ansible 中 - angular - RxJS | 如何使用 concatMap 在管道中捕获和失败?
- android - Dagger2如何执行默认构造函数的构造函数注入
- javascript - 在 Chrome 和 IE 中记录元素的不同输出
- json - 如何使用 jq 将来自不同 JSON 对象的值组合到一行 CSV
- testing - 如何正确测试 Flink 窗口功能?
- c# - 列表
foreach 获取值 - javascript - 是否有可能有多个未完成的异步请求?
- ibm-watson - 将 DNN 模型发送到 Watson 进行训练时打开数据文件时出错
- c# - 这个 Ajax 调用有什么问题?