我尝试更新大型(数百万条记录)表格,并且我继续获得ProvisionedThroughputExceededException
例外,尽管事实上CloudWatch显示我无法接近我的容量/吞吐量限制
我有一个写入容量为200的dynamodb表。我的项目通常是2Kb,我一次发送40个项目,然后睡眠1秒钟。由于发电机每次写入1次写入加上每次写入一次写入,因此大致相当于每秒120(40 * 2)次写入单位,这比我们的写入容量200小。
这是一个长期运行的工作(一夜之间),并且第一个~15,000左右的记录更新就好了没有抱怨,但之后,每次写入都受到限制。我的重试次数呈指数延迟,所以我的工作继续进行,但延迟显然导致了大幅减速。
当我查看平均指标和总指标与我在云监视中的规定相比时,我是方式在限制之下。
这是最大值,显然平均值会低很多。即使在代码中,我也会进行类似的计算,以编程方式限制我的请求ceil(size of items) / 1000
以防止发送超过阈值。
什么是发电机测量我不是,如何正确使用CloudWatch来获得正确的?
如果按照此question的建议,我有热键或分布不均的数据,我该如何检测或发现?有没有办法确定发电机是在一个碎片上颠簸,而不是其他碎片 - 那里的云观察是什么?
答案 0 :(得分:0)
根据分区键将表拆分为多个分区。 您为表设置的总写入吞吐量将分发到这些分区。 如果对表的访问不够随机(基于所选的分区键),并且最终命中同一分区,超出分区的预配置吞吐量,同时低于表的预配置吞吐量,则可以获得ProvisionedThroughputExceededException。
确保您选择了一个好的分区键(足够随机的键)并且您的访问权限是随机的。
有关分区的更多详细信息:
如果您只配置了200次写入,为什么会有多个分区?
单个分区可容纳大约10 GB的数据,最多可支持3,000个读取容量单位或1,000个写入容量单位。
因此,可能是因为您拥有超过10 GB的数据,或者您的项目很大,1次单次写入消耗的数量超过1个写入单位,或者您配置了超过3000个读取容量单位,这将需要额外的分区。 相同的计算适用于附加到父表的全局二级索引。 GSI拥有自己的分区密钥。
容量单位大小
一个读取容量单位=每秒一次强烈一致的读取,或每秒两次最终一致读取,对于大小为4 KB的项目。
一个写入容量单位=每秒一次写入,对于最大1 KB的项目。