为什么在Lambda中使用递归 Promises 查询 DynamoDB 过于缓慢? - JavaScript,分片

0

【以下的问题经过翻译处理】 我正在尝试获取dynamodb表中最近创建的项目。为此,我使用Alex Debrie在他的dynamoDB书中描述的模式加上分片。当表中创建新项目时,它还会向GSI提供带有项创建日加上0到9之间的随机分片号的GSIPK。SK将是项唯一的ID。

GSI1

  • GSI1PK:截断的时间戳#[0-9]
  • GSI1SK:项ID

最近创建的项目可能只有几十个,也可能有数千个。

为了获取最新的项目,我有三个参数:

  • 日期:当前日期
  • 限制:要获取的项目的总量
  • 天数:向后查找项目的天数

像Alex Debrie书中建议的那样,检索项目的方法是一个具有承诺的递归函数。

我面临的问题是我的lambda函数非常慢。

在不那么多最近创建的项目的情况下,该函数必须一次接着一次地通过所有日期+分片以获取项目。例如。如果我想在过去的7天中获取最后100个项目。如果分散在分片中的项目少于100个,则该函数将经过70个查询(7天x 10个分片),并且需要大约10秒才能完成。

相反,如果我想在过去的7天里获取100个项目,并且最近创建了数百个项目,则需要大约一秒钟才能运行。

  • 项目很小,每个项目约为400字节。
  • 我正在运行需求量动态变化的dynamodb表。
  • Lambda配置为memorySize:1536MB
  • Node.js 16.x
  • 有什么想法可以让它运行更快吗?
profile picture
专家
已提问 8 个月前38 查看次数
1 回答
0

【以下的回答经过翻译处理】 以下是演示串行和并行分片查询的示例。

注意:当我将Limit设置为1时,我遇到了一个奇怪的问题。这可能是因为索引中有多条记录具有相同的值。不知何故,分页没有正常工作...

请注意,以并行方式执行此操作可能是“过早优化”。在我的示例中,我发现串行速度提高了300毫秒,而并行速度提高了50毫秒(不包括冷启动时间:-))

在下面的示例中,我将用户名添加到索引中。我认为你的用例不需要这个。

尽管如此,我认为表模式并不适合您的用例。

或许像这样的设计会更好:

GSI - 非截断日期时间 - 分区键

然后,要获取最新项目,只需从此索引开始反向扫描。

profile picture
专家
已回答 8 个月前

您未登录。 登录 发布回答。

一个好的回答可以清楚地解答问题和提供建设性反馈,并能促进提问者的职业发展。

回答问题的准则