为什么在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
EXPERTE
gefragt vor 8 Monaten39 Aufrufe
1 Antwort
0

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

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

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

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

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

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

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

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

profile picture
EXPERTE
beantwortet vor 8 Monaten

Du bist nicht angemeldet. Anmelden um eine Antwort zu veröffentlichen.

Eine gute Antwort beantwortet die Frage klar, gibt konstruktives Feedback und fördert die berufliche Weiterentwicklung des Fragenstellers.

Richtlinien für die Beantwortung von Fragen