如何处理 Dynamodb BatchWriteItem 的限制



只是想知道处理dynamodb只能写入最大25的批量大小这一事实的最佳方法是什么。

我有 3 个 Lambda(还有更多,但我正在简化,这样我们就不会偏离轨道)

  1. GetNItemsFromExternalSourceLambda
  2. SaveAllToDynamoDBLambda
  3. AnalyzeDynamoDBLambda

以下是发生的情况:

  • GetNItemsFromExternalSourceLambda可以在对外部API进行的1次休息调用中获取250个项目。
  • 然后,它调用 SaveAllToDynamoDBLambda 并传递 a) 所有这些项目和 b) 分页信息,例如 {pageNum:1, pageSize : 250, numPages:5 } 在有效负载中
  • SaveAllToDynamoDBLambda 需要将所有项目保存到 dynamodb 表中,然后,根据分页信息将 a) 重新调用 GetNItemsFromExternalSourceLambda(获取下一页数据)或 b) 调用 AnalyzeDynamoDBLambda
  • 这些步骤显然可以循环多次,直到我们从外部源获得所有数据,然后最终进入最后一步
  • 最后的 AnalyzeDynamoDBLambda 是一些 lambda,它处理所有获取并保存到数据库
  • 的数据。

所以我的问题实际上在于SaveAllToDynamoDBLambda只能批量写入25个项目,这意味着我必须告诉我的GetNItemsFromExternalSourceLambda一次只能从外部源获取25个项目,这并不理想。(一次能够拿250个会好得多)

可以延长 SaveAllToDynamoDBLambda 的超时期限,以便它可以在一次调用中执行多个批处理写入,但我不喜欢这种方法。

我还可以压缩 250 个项目并在一次上传中保存到 s3,这可能会触发流事件,但我在该解决方案的另一端会遇到同样的问题。

只是想知道有什么更好的方法,同时只有在所有 rest 调用的所有信息都保存到 dynamodb 之后,才能调用 AnalyzeDynamoDBLambda。

基本上,问题是您需要一种方法将大批量(在本例中为 250 个项目)细分为少于 25 个的批次。

一个非常简单的解决方案是在中间使用 Kinesis 流。Kinesis 每次 PutRecords 调用最多可以获取 500 条记录。然后,您可以使用Limit为 25 的 GetRecords,并通过单个 BatchWriteItem 调用将记录放入 Dynamo 中。

在决定此解决方案是否适合您之前,请确保也查看大小限制。

最新更新