我们试图通过物联网的东西充分利用AWS的DynamoDB的NoSQL,但我们不确定项目长度或项目插入的最佳实践。
流程,每个设备可以读取环境数据,根据捕获的数据类型,设备将“事件”的JSON
消息发送到IoT代理,然后发送到Lambda函数以映射该有效负载,处理它并写入DynamoDB表。
然后,每种类型的事件捕获一个表,以及从设备接收的每个事件消息的项目。但我们已经意识到这只是另一种伪关系方法。
阅读文档,并考虑只有一个表作为最佳实践,并且每个设备在其内部生长一个项目,其中包含按密钥名称分类的JSON
事件的数组。
就像是:
{
"partition":"<str_an_id>"",
"range":<uint_maybe_a_timestamp>,
"event_soil":[
{<<object with variable length #0},
{<<object with variable length #1}
...
{<<object with variable length #n}
],
"event_humidity":[
{<<object with variable length #0},
{<<object with variable length #1}
...
{<<object with variable length #n}
],
"event_light":[
{<<object with variable length #0},
{<<object with variable length #1}
...
{<<object with variable length #n}
],
"event_temperature":[
{<<object with variable length #0},
{<<object with variable length #1}
...
{<<object with variable length #n}
]
}
目前我们有两个设备,所以我们期望从设备中使用JSON
有效载荷增加两个项目。但是,在某些时候,达到了内存阈值,并且DynamoDB的400
错误代码会提升。
这种方法对吗?还是完全错了?
是否有任何方法可以知道何时达到该限制?比如,某种分页还是什么?
计算项目大小的计算很难,因为JSON
对象的长度目前不同,将来可能会有所不同。
此外,我们还考虑每台设备每隔一两个月(理论上自加速设备以来)创建项目。但是,不确定。
每个设备在其内部生长一个项目,其中包含按密钥名称分类的JSON事件数组。
如果我理解上面的内容,那么代码示例......
我会说你做错了。反复更新一些记录并不是一个好主意。除了你似乎认识到的项目中的空间不足之外,你需要支付两倍的I / O(1次读取+ 1次写入)。不知道你从哪里得到了这个想法..
对于物联网设备,似乎您正在处理时间序列数据,因此一定要了解Best Practices for Handling Time-Series Data in DynamoDB
也许只有两个设备才有点过分......但假设你要大幅度扩展......
我的第一个传递将是Partition-Key:“deviceName #date”,排序键:“time”
在这种情况下,“日期”可以是完整的日期,YYYY-MM-DD,或者只是YYYY-MM,甚至是YYYY。将左侧的日期部分移动到排序键。一切都取决于您期望的数据量。要考虑的是给定分区(密钥)只能存储10GB的数据。
如果您可以将数据保留限制为小于10GB的设备,我只需将设备用作分区键,将日期移至排序键。
编辑 关键点
2非常重要,假设您选择一个给定的时间段(最后24小时,上周,等等),您将要处理给定设备的所有事件,特定类型的所有事件,所有设备的所有事件,或者...... ..
并不是说你不能做到以上所有,但主要的访问是什么?
“永远给我所有数据”每次都是Scan()......当然不是一种经济有效的访问方法。