在我的表“products_1”中,我配置了1个容量单位读取和1个容量单位写入。
我正在使用AWS PHP SDK使用“BatchWriteItem”将8个项目写入DynamoDB。代码返回了此响应:
Object ( [structure:protected] => [data:protected] => Array ( [ConsumedCapacity] => Array ( [0] => Array ( [CapacityUnits] => 8 [TableName] => products_1 ) ) [UnprocessedItems] => Array ( ) ) )
如您所见,它使用了8个容量单位,这是正确的。
但是当我在AWS Console中检查Monitor时,我在“Throttled Write Requests”图表中看不到任何条目。我原以为写请求会受到限制,因为我认为“BatchWriteItem”会在一秒内写出 8项。
我的假设是错的吗?如果没有,我想知道为什么写入不会出现在“Throttled Write Requests”图表中。
答案 0 :(得分:2)
控制台显示5分钟的平均时间。计算使用单位的总和:8个单位/ 300秒=每秒0.027个单位。看起来你没有受到限制。
引用AWS了解如何计算配置的吞吐量:
使用Sum值计算预配置吞吐量。例如,在5分钟的范围内获取Sum值。将Sum值除以5分钟(300)中的秒数,以获得每秒ConsumedWriteCapacityUnits的平均值。您可以将计算值与您提供的Amazon DynamoDB的预配置吞吐量值进行比较。
答案 1 :(得分:2)
Amazon DynamoDB基本上允许突发活动而不会受到限制,但如果您在一段时间内将操作/秒维持在规定金额之上,则会开始受到限制。
对于非批量操作,AWS SDK for PHP还会使用指数退避算法自动重试受限制的请求,因此即使您受到限制,也不一定会在PHP中出错代码。
对于批处理操作,就像您在这里使用一样,您将知道您是否受到限制,因为您将在响应的UnprocessedItems
部分显示内容。
单独但相关:如果你计划进行大量的put操作并且担心限制,你应该使用SDK的check out the WriteRequestBatch
class,它使用批处理和排队来制作确保你的所有物品最终都放好了。
答案 2 :(得分:0)
DynamoDB 目前最多可保留 5 分钟(300 秒)未使用的读写容量。在偶尔突发的读取或写入活动期间,这些额外的容量单位可能会被快速消耗 - 甚至比您为表定义的每秒预配置吞吐容量还要快
因为您为表配置了 1 个 WCU,因此您在 5 分钟内节省了大约 300 个 WCU。因此,您消耗 8 个 WCU 的批处理请求不会受到限制。