我在DynamoDB中有table
个聚合数据,这些数据来自staging_table
的质量检查数据。
我有多个脚本,可以在staging_table
(所有项目)中执行扫描,进行某种计算或验证,并可能需要插入/更新这些暂存项目中的属性,在最终将它们转移到实际的table
之前。请注意,此完整扫描会发生多次,因为每个质量检查过程都独立于其他过程,但它们并行发生。
在成本和性能方面,这里最好使用哪些DynamoDB操作?更客观地说,我想到的最初的替代方案是:
PutItem
是唯一可用的批处理操作)UpdateItem
操作(更多API调用,但每个调用更便宜)有更好的方法吗?这种情况不适合DynamoDB吗?
答案 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。
我认为理想情况下,您将使用最简单的方法对流程进行原型设计,然后分析解决方案以查看哪些位需要大量时间。然后,您可以查看优化过程的这些部分。