Amazon DynamoDB Mapper - 对批处理操作的限制

Amazon DynamoDB Mapper - limits to batch operations

我正在尝试将大量记录写入 dynamoDB,我想知道这样做的正确方法是什么。目前,我正在使用 DynamoDBMapper 在一个 batchWrite 操作中完成这项工作,但在阅读文档后,我不确定这是否是正确的方法(特别是如果对写入项目的大小和数量有一些限制)。

比方说,我有一个包含 10000 条记录的 ArrayList,我这样保存它:

mapper.batchWrite(recordsToSave, new ArrayList<BillingRecord>());

第一个参数是包含要写入的记录的列表,第二个参数包含要删除的项目(在本例中没有此类项目)。

映射器是将此写入拆分为多个写入并处理限制还是应该明确处理?

我只找到了直接使用 AmazonDynamoDB 客户端完成 batchWrite 的示例(例如 THIS 一个)。直接使用客户端进行批处理操作是否正确?如果是这样,拥有映射器有什么意义?

映射器是否将您的对象列表分成多个批次,然后分别写入每个批次?是的,它会为您进行批处理,您可以看到它将要写入的项目分成最多 25 个项目的批次 here. It then tries writing each batch and some of the items in each batch can fail. An example of a failure is given in the mapper documentation:

This method fails to save the batch if the size of an individual object in the batch exceeds 400 KB. For more information on batch restrictions see, http://docs.aws.amazon.com/amazondynamodb/latest/APIReference/API_BatchWriteItem.html

该示例讨论的是超过 400KB 的一条记录(在您的案例中是一个 BillingRecord 实例)的大小,在撰写此答案时,这是 DynamoDB 中一条记录的最大大小。

在特定批次失败的情况下,它会转到下一批次(让线程休眠一段时间以防失败是由于节流引起的)。最后,所有失败的批次都在 FailedBatch instances. Each FailedBatch 实例列表中返回,其中包含未写入 DynamoDB 的未处理项目列表。

您提供的片段是否是进行批量写入的正确方法?我可以想到两个建议。如果您没有要删除的项目,则 BatchSave 方法更合适。您可能还想考虑如何处理失败的批次。

直接使用客户端是正确的方法吗?如果是这样,映射器的意义何在?映射器只是客户端的包装器。映射器为您提供一个 ORM 层,以将您的 BillingRecord 实例转换为低级客户端使用的那种嵌套哈希映射。直接使用客户端并没有什么问题,这在某些特殊情况下确实会发生,在这些特殊情况下,需要在映射器之外编写额外的功能。