如何处理Dynamodb BatchWriteItem

时间:2018-04-11 16:02:43

标签: amazon-web-services aws-lambda amazon-dynamodb

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

我有3个Lambdas(还有更多,但我正在简化,所以我们不会被跟踪)

  1. GetNItemsFromExternalSourceLambda
  2. SaveAllToDynamoDBLambda
  3. AnalyzeDynamoDBLambda
  4. 以下是发生的事情:

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

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

    可以延长SaveAllToDynamoDBLambda的超时时间,以便它可以在一次调用中进行多次批量写入,但我不喜欢这种方法。

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

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

1 个答案:

答案 0 :(得分:0)

基本上问题是你需要一种方法将大批量(在这种情况下为250个项目)细分为25个以下的批次。

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

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