DynamoDB预配置的写入容量单位过于频繁且意外

时间:2018-09-30 01:11:32

标签: amazon-dynamodb

我相信我了解写/读容量单位,它们如何工作以及如何在DynamoDB中进行计算。事实证明,我对this以及aws documentation都非常了解。就是说我在向表中写入项目时遇到了意外的行为。

我有一个具有以下设置的DynamoDB表。最值得注意的是5个读写容量单位

dynamodb table settings overview

我要在这张表中放入连接到Raspberry Pi的传感器的读数,这些传感器是我用python2.7获取并通过my script发送到Dynamo的。

此项目肯定少于1KB。他们看起来像这样:

{
    "reading_id": "<current_time>",
    "sensor_id": "<SENSORS_IDS[i]>",
    "humidity": "<humidity>",
    "temperature": "<temperature>"
}

My script遍历传感器,从其中读取并每5秒用table.put_item将传感器的读取/项目提交给DynamoDB。也就是说,如果从传感器读取成功,则可以任意等待30秒。

现在,根据我的计算,我每5秒写入DynamoDB 1KB项,这应该没问题,因为我的表是用5WCU =(5items * 1KB)/第二写入吞吐量设置的。

所以我的问题是:

1

如此小的负载(如果我相信正在发生的话)怎么超过我的5 WCU?

dynamodb table write capacity units metric

2 。我已经使用此设置进行了大约一年的无更改操作(免费套餐于2018年9月30日结束)。这是怎么回事,几个月前甚至在免费套餐结束之前就开始发生变化,如下所示:

dynamodb billing ytd

到目前为止,我唯一的怀疑是time.sleep(),因为在文档中说:

  

time.sleep(secs)

     

在给定的秒数内暂停当前线程的执行。该参数可以是浮点数,以指示更精确的睡眠时间。实际的暂停时间可能少于请求的暂停时间,因为任何捕获到的信号都会在执行该信号的捕获例程后终止sleep()。另外,由于系统中其他活动的安排,暂停时间可能比请求的时间长任意数量。

我对python不太熟悉,这使我认为它可能在我的代码中。但这并不能解释我今年早些时候没有这个问题的事实。

任何人对以上问题的答案有任何想法,或者我应该在哪里进一步调查此问题?

注意:我在这里搜索了Google和其他相关问题。似乎没有一个适合我的情况。

谢谢。

2 个答案:

答案 0 :(得分:0)

也许您的表分区不均匀。您可能想阅读有关DynamoDB Partitions and Data Distribution的信息。

答案 1 :(得分:0)

您共享的图表显示的是一分钟内的累计消费量。也就是说,图表上每个数据点每60秒消耗的所有容量的总和。

当您为一个表配备5个WCU时,这意味着您最多只能每秒写5个1KB项。有效地使您每分钟最多可以使用300个WCU。

因此,只要您看到6个左右的数据点,那就完全可以了。

要注意的一件事是预配置写吞吐量的 sum (橙色线)实际上不是总和。这似乎是CloudWatch中的错误:它是每秒预置的吞吐量。

次要观察:您每分钟显示5-6个单位,这意味着您实际上正在睡近10秒,而不是两次写入之间的5秒。

最后,使用Dynamo,您需要支付保留的容量,而不是消耗的容量。因此,只要您的餐桌没有受到限制,即使您稍微超出了预配置的容量(在某些情况下Dynamo允许),您也无需支付额外费用。