我在dynamodb中有一个数据集,其主键是用户ID,时间戳是数据属性之一。我想在这个表上运行一个清除查询,其中时间戳大于1周。
我不希望每5个单位消耗所有写操作。理想情况下,我想要一个速率限制删除操作(在php中)。否则,对于10gb大小的数据集,它将停止其他写操作。
我想知道在时间戳(+用户ID)上使用全局二级索引是否有助于减少要扫描的行。但是,同样,我不希望对表进行重击,这样其他写操作就会开始失败。
有人可以提供速率限制插入/删除示例代码和参考这在php?
可以创建全局二级索引:
timestampHash (number, between 1 and 100)
timestamp (number)
无论何时创建/更新时间戳,也将timestampHash
属性设置为1到100之间的随机数。这将均匀地分布索引中的项。你需要这个哈希,因为在GSI上做一个范围查询,你需要一个哈希。按用户id和时间戳查询似乎没有意义,因为每次只返回一个项目,您将不得不循环遍历所有用户(假设每个用户id有一个项目)。
然后您可以运行一个purger,它将对每个timestampHash
编号和timestamp
大于1周的所有项目执行100次查询。在每次运行之间,您可以等待5分钟,或者您认为合适的时间,这取决于您需要清除的项目的数量。
你可以使用BatchWriteItem来利用API的多线程来并发删除。
在伪代码中是这样的:while (true) {
for (int i = 0; i < 100; i++) {
records = dynamo.query(timestampHash = i, timestamp < Date.now());
dynamo.batchWriteItem(records, DELETE);
}
sleep(5 minutes);
}
您还可以捕获ProvisionedThroughputExceededException
并执行指数回退,以便如果您确实超过了吞吐量,您将合理地停止并等待,直到吞吐量恢复。
另一种方法是按时间来组织你的表。
TABLE_08292016
TABLE_09052016
TABLE_09122016
2016年8月28日这一周的所有数据将进入TABLE_08292016
。然后在每周结束的时候,你可以把表格删除。