更新与覆盖DynamoDB中的临时表的项目

时间:2017-12-01 18:11:06

标签: amazon-dynamodb

我在DynamoDB中有table个聚合数据,这些数据来自staging_table的质量检查数据。

我有多个脚本,可以在staging_table(所有项目)中执行扫描,进行某种计算或验证,并可能需要插入/更新这些暂存项目中的属性,在最终将它们转移到实际的table之前。请注意,此完整扫描会发生多次,因为每个质量检查过程都独立于其他过程,但它们并行发生。

在成本和性能方面,这里最好使用哪些DynamoDB操作?更客观地说,我想到的最初的替代方案是:

  • 使用批处理项目写入覆盖旧版本的数据(因为PutItem是唯一可用的批处理操作)
  • 使用顺序UpdateItem操作(更多API调用,但每个调用更便宜)

有更好的方法吗?这种情况不适合DynamoDB吗?

1 个答案:

答案 0 :(得分:1)

我认为您的解决方案将取决于您的重要性;

  • 您的运营的货币成本
  • 数据到达临时表并在主表中可用的延迟
  • 简单

BatchWriteItem使用与PutItem和UpdateItem相同数量的write capacity units,因此货币成本相同。

BatchWriteItem应该减少临时表和主表之间的延迟(与PutItem或UpdateItem相比),但这是以简单为代价的,因为批处理中不能超过25个项目,每个项目不能超过400KB,总批量不能超过16MB。所以你要编写更多的代码。如果达到这些限制,可以创建较小的批次,或者考虑使用PutItem或UpdateItem编写自己的并行线程模型。

您可以通过增加表格RCU和WCU来减少延迟。您需要针对两个表之间的特定操作优化这些。

如果与您的阅读/分析时间相比,最小化您的写作时间可能很重要。如果使用UpdateItem进行扫描需要一分钟,而使用UpdateItem进行后续写入需要一秒钟,那么使用batchwriteitem几乎没有意义。

我建议您在PutItem或UpdateItem之间看到很少或没有区别。它们消耗相同数量的WCU,因此假设您的吞吐量有限,则没有差别。

需要考虑的一件事是Scan默认情况下读取不一致,这意味着表格可能会在扫描的开始和结束之间发生变化。根据您的质量扫描,您可能希望将ConsistentRead设置为true。

我认为理想情况下,您将使用最简单的方法对流程进行原型设计,然后分析解决方案以查看哪些位需要大量时间。然后,您可以查看优化过程的这些部分。