我需要创建一个表,其中包含由连续运行的进程生成的一片数据。此过程生成包含两个必需组件的消息,其中包括:全局唯一消息UUID和消息时间戳。
UUID稍后将检索这些消息。
此外,我需要定期删除该表中过于陈旧的所有消息,即其时间戳远离当前时间的X。
我一直在阅读DynamoDB v2文档(例如Local Secondary Indexes),试图找出如何组织我的表以及我是否需要二级索引来执行搜索要删除的邮件。我的问题可能有一个简单的答案,但我有点困惑......
那么我应该创建一个表,其中UUID作为哈希,而messageTimestamp作为范围键(以及包含实际消息的“message”属性),然后不创建任何二级索引?在我看过的例子中,哈希是不唯一的(例如上面链接下的ForumName)。在我的例子中,哈希将是唯一的。我不确定是否有任何区别。
如果我按照描述创建带有散列和范围的表,并且没有辅助索引,那么无论UUID如何,我如何查询某个时间范围内的所有消息?
答案 0 :(得分:3)
DynamoDB引入了Global Secondary Index来解决这个问题。 http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/GSI.html
答案 1 :(得分:1)
我们也在努力解决这个问题。我们提出的最佳解决方案是创建第二个表来存储时间序列数据。要做到这一点:
1)使用日期加“桶”id作为哈希键
你可以只使用日期,但我猜今天的日期会成为一个“热门”的密钥 - 一个频率过高的密钥。这可能会造成严重的瓶颈,因为特定DynamoDB分区的总吞吐量等于总预配置吞吐量除以分区数 - 这意味着如果所有写入都是针对单个密钥(今天的密钥)并且您具有吞吐量每秒20次写入,然后有20个分区,您的总吞吐量将是每秒1次写入。超出此范围的任何请求都将受到限制。不太好。
存储桶可以是从1到n的随机数,其中n应该大于底层数据库使用的分区数。当然,确定n有点棘手,因为Dynamo没有透露它使用了多少分区。但我们目前根据找到的here示例使用上限200。这个链接的写作是我们提出这种方法的基础。
2)使用范围键的UUID
3)通过发出每天和每天的查询来查询记录。 这可能看起来很乏味,但它比完整扫描更有效。另一种可能性是使用Elastic Map Reduce工作,但我还没有尝试过,所以不能说它是多么容易/有效。
我们仍在自己解决这个问题,所以我很想听听别人的评论。我还发现这个演示文稿非常有助于思考如何最好地使用Dynamo: Falling In and Out Of Love with Dynamo
-John
答案 2 :(得分:0)
总之,你不能。所有DynamoDB查询必须包含查询中的主哈希索引。或者,您也可以使用范围键和/或本地二级索引。使用当前的DynamoDB功能,您将无法使用LSI作为主索引的替代方案。您也无法仅使用范围键发出查询(您可以在AWS控制台中轻松测试)。
我能想到的(昂贵的)解决方法是发出表的扫描,根据时间戳值添加过滤器,以找出要删除的字段。请注意,过滤不会减少查询的已用容量,因为它将解析整个表。