【发布时间】:2019-03-28 18:07:24
【问题描述】:
在将现有 Node.js (Hapi.js) + RethinkDB 从 OVH VPS(最小 vps)迁移到 AWS Lambda(节点)+ DynamoDB 的过程中,我最近遇到了一个非常巨大的性能问题。
用法相当简单,人们使用在线工具,“东西”通过 node.js 服务器/lambda 保存在数据库中。那个“东西”占用了一些空间,大约 3kb 非 gzip 压缩(一个有很多键和子的复杂对象,因此为什么使用 NOSQL 解决方案是有意义的)
保存本身没有问题(目前......),没有多少人使用该工具,也没有太多同时编写的工作,使用 Lambda 而不是 24/7 是有意义的运行 VPS。
真正的问题是我何时想要下载这些结果。
- 使用 Node+RethinkDB 大约需要 3 秒 扫描整个表并生成 CSV 文件以供下载
- AWS Lambda + DynamoDB 超时 30秒后,即使我对结果进行分页只下载1000条,仍然需要20秒(这次没有超时,只是很慢)->有2200如果 AWS Lambda 在 30 秒后不超时,我们可以推断出我们需要大约 45 秒来下载整个表
因此,对于相同数量的提取数据,RethinkDB 的操作大约需要 3 秒,理论上 DynamoDB 需要 45 秒。
现在让我们看看这些数据。表中有 2200 个项目,总共 5MB,以下是 DynamoDB 统计信息:
Provisioned read capacity units 29 (Auto Scaling Enabled)
Provisioned write capacity units 25 (Auto Scaling Enabled)
Last decrease time October 24, 2018 at 4:34:34 AM UTC+2
UTC: October 24, 2018 at 2:34:34 AM UTC
Local: October 24, 2018 at 4:34:34 AM UTC+2
Region (Ireland): October 24, 2018 at 2:34:34 AM UTC
Last increase time October 24, 2018 at 12:22:07 PM UTC+2
UTC: October 24, 2018 at 10:22:07 AM UTC
Local: October 24, 2018 at 12:22:07 PM UTC+2
Region (Ireland): October 24, 2018 at 10:22:07 AM UTC
Storage size (in bytes) 5.05 MB
Item count 2,195
有 5 个预置读/写容量单位,最大自动缩放为 300。但自动缩放似乎没有像我预期的那样扩展,从 5 变为 29,可以使用 300,这足以下载30 秒内 5MB,但不使用它们(我刚刚开始使用自动缩放,所以我猜它配置错误?)
在这里我们可以看到自动缩放的效果,它确实增加了读取容量单位的数量,但是这样做太晚了,并且已经发生了超时。我尝试连续多次下载数据,并没有真正看到太大的改进,即使是 29 个单元。
Lambda 本身配置了 128MB RAM,增加到 1024MB 没有效果(正如我所料,它确认问题来自 DynamoDB 扫描持续时间)
所以,这一切让我想知道为什么 DynamoDB 不能在 30 秒内做什么 RethinkDB 在 3 秒内做什么,它与任何类型的索引无关,因为操作是“扫描”,因此必须遍历数据库中的所有项目以任何顺序。
我想知道我应该如何使用 DynamoDB 获取巨大的数据集(5MB!)以生成 CSV。
我真的想知道 DynamoDB 是否是适合这项工作的工具,与我过去使用的工具(mongo、rethink、postgre 等)相比,我真的没想到性能如此之低
我想这一切都归结为正确的配置(那里可能有很多需要改进的地方),但即便如此,为什么下载一堆数据如此痛苦? 5MB 不是什么大问题,但感觉需要付出很多努力和关注,而导出单个表只是一个常见的操作(统计信息、用于备份的转储等)
编辑:由于我创建了这个问题,我阅读了https://hackernoon.com/the-problems-with-dynamodb-auto-scaling-and-how-it-might-be-improved-a92029c8c10b,它深入解释了我遇到的问题。基本上,自动缩放的触发缓慢,这解释了为什么它不能根据我的用例正确缩放。如果您想了解 DynamoDB 自动扩展的工作原理,这篇文章是必读的。
【问题讨论】:
-
如果您在运行 Lambda 函数之前手动将 DynamoDB 表吞吐量更改为 300,而不是依赖自动扩展,会发生什么情况?我认为自动扩展的速度太慢,无法帮助您调用单个 Lambda 函数。此外,如果您的 Lambda 函数在 30 秒时超时,那么您必须以这种方式对其进行配置。您需要增加函数的超时值。此外,增加 Lambda 函数设置中的可用 RAM 也会增加可用 CPU,因此您可以尝试将其提高到最高设置。
-
30 秒是 Lambda 通过 APIGateway 允许的最大值,所以我无法增加它,我尝试先自动缩放它,认为它可以处理活动峰值,但我不想要当我大部分时间几乎不使用它们但偶尔需要它们时支付 300 RCU
-
啊,你没有提到你也在使用 API Gateway。这听起来更像是一个可以按计划运行而不是由 API Gateway 触发的后端进程。
-
是的,没想到要带上这个。关键是在有人需要时下载文件,这样做是有意义的,当使用 RethinkDB 需要几秒钟时,这不是问题 :)
标签: node.js amazon-web-services aws-lambda amazon-dynamodb