I Z*_*I Z 5 indexing amazon-dynamodb secondary-indexes
我需要创建一个表,其中包含由连续运行的进程生成的数据片段。此过程生成的消息包含两个必需组件,其中包括:全局唯一的消息 UUID 和消息时间戳。
这些消息稍后将通过 UUID 检索。
此外,我需要定期删除该表中太旧的所有消息,即时间戳距当前时间超过 X 的消息。
我一直在阅读 DynamoDB v2 文档(例如本地二级索引),试图弄清楚如何组织我的表以及是否需要二级索引来搜索要删除的消息。我的问题可能有一个简单的答案,但我有点困惑......
那么我是否应该创建一个表,其中 UUID 作为哈希值,messageTimestamp 作为范围键(以及包含实际消息的“消息”属性),然后不创建任何二级索引?在我看到的示例中,哈希值不是唯一的(例如上述链接下的 ForumName)。就我而言,哈希值将是唯一的。我不确定是否有什么区别。
如果我使用所描述的哈希和范围创建表,并且没有二级索引,那么我将如何查询特定时间范围内的所有消息,无论其 UUID 是什么?
我们也一直在努力解决这个问题。我们提出的最佳解决方案是创建第二个表来存储时间序列数据。去做这个:
1)使用日期加上“bucket”id作为哈希键
您可以只使用日期,但我猜测今天的日期将成为“热门”键 - 写入频率过高的键。这可能会造成严重的瓶颈,因为特定 DynamoDB 分区的总吞吐量等于总预配置吞吐量除以分区数量 - 这意味着如果您的所有写入都针对单个键(今天的键)并且您有一个吞吐量每秒 20 次写入,那么如果有 20 个分区,您的总吞吐量将为每秒 1 次写入。任何超出此范围的请求都将受到限制。情况不太好。
存储桶可以是从 1 到 n 的随机数,其中 n 应大于底层数据库使用的分区数。当然,确定 n 有点棘手,因为 Dynamo 没有透露它使用了多少个分区。但根据此处的示例,我们目前正在使用 200 的上限。此链接上的文章是我们提出这种方法的思考的基础。
2)使用UUID作为范围键
3)通过对每一天和桶发出查询来查询记录。 这可能看起来很乏味,但它比完整扫描更有效。另一种可能性是使用弹性映射减少作业,但我自己还没有尝试过,所以不能说它使用起来有多容易/有效。
我们仍在自己解决这个问题,所以我有兴趣听听其他人的评论。我还发现本演示文稿对于思考如何最好地使用 Dynamo 非常有帮助: 爱上和失去对 Dynamo 的喜爱
-约翰
| 归档时间: |
|
| 查看次数: |
2781 次 |
| 最近记录: |