清除旧数据在dynamo数据库的速率限制在php


Purge old data in dynamo db by rate limiting in php

我在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。然后在每周结束的时候,你可以把表格删除。