我相信我理解写/读容量单位,它们是如何工作的,以及如何在DynamoDB中计算。证明就是我完全理解这篇文章以及aws文档。也就是说,我在向表中写入项目时遇到了意外行为。
我有一个具有以下设置的 DynamoDB 表。最值得注意的是 5 个写入/读取容量单位
我把从连接到Raspberry Pi的传感器读取的数据放入这个表中,我用< code>python2.7将这些数据和我的脚本一起发送到Dynamo。
此项目肯定小于 1KB。它们看起来像这样:
{
"reading_id": "<current_time>",
"sensor_id": "<SENSORS_IDS[i]>",
"humidity": "<humidity>",
"temperature": "<temperature>"
}
我的脚本遍历传感器,从一个传感器读取,并使用表将传感器的读取/项目提交给DynamoDB。put_item
每5秒一次。也就是说,如果从传感器读取成功,否则任意等待30秒。
现在根据我的计算,我每5秒向DynamoDB 1KB项目写入一次,这应该很好,因为我的表设置为5WCU=(5items*1KB)/秒写入吞吐量。
所以我的问题是:
1.这个小负载(如果我相信发生了的话)是如何超过我这里看到的5 WCU的呢?:
2.我已经用这个设置运行了大约一年,没有任何变化(免费层将于2018年9月30日结束)。这是怎么回事,它在几个月前甚至在免费层结束之前就开始改变了,就像这里看到的那样?:
到目前为止,我唯一的怀疑是 time.sleep(),
因为在文档中,它说:
时间.睡眠(秒)
在给定的秒数内暂停当前线程的执行。该自变量可以是浮点数,以指示更精确的睡眠时间。实际暂停时间可能比请求的时间短,因为任何被捕获的信号都会在执行该信号的捕获例程后终止sleep()。此外,由于系统中其他活动的调度,暂停时间可能比请求的时间长任意量。
我对python不是很熟悉,这让我觉得它可能是我代码中的东西。这并不能解释我今年早些时候没有遇到这个问题的事实。
任何人都知道上述问题的答案,或者我应该在哪里进一步调查这个问题?
注:我在这里搜索了谷歌和其他相关问题。似乎没有一个适用于我的情况。
非常感谢。
也许您的表分区不均匀。您可能想了解DynamoDB分区和数据分发。
您正在共享的图表显示了一分钟内的消费汇总。也就是说,对于图表上的每个数据点,每60秒消耗的所有容量的总和。
当您预配一个包含5个WCU的表时,这意味着您每秒最多只能写入5个1KB的项目。实际上,这使您每分钟最多可以使用300个WCU。
所以,只要你看到6个左右的数据点,那就完全没问题。
需要注意的一点是,调配的写入吞吐量之和(橙色线)实际上并不是一个总和。这似乎是CloudWatch中的一个bug:相反,它是每秒提供的吞吐量。
一个小观察:你每分钟显示5-6个单位,这意味着你实际上在睡眠接近10秒,而不是写入之间的5秒。
最后,使用Dynamo,您需要为您预留的容量付费,而不是为您消耗的容量付费。因此,只要您的表没有被节流,即使您稍微超出了供应的容量(在某些情况下Dynamo允许),也不会向您收取额外费用。