0

我在 dynamodb 中有数据集,其主键是用户 ID,时间戳是数据属性之一。我想在这个表上运行一个清除查询,其中时间戳早于 1 周。

我不想吃掉每 s 单位的所有写入。理想情况下,我想要一个速率限制删除操作(在 php 中)。否则对于大小为 10sof GB 的数据集,它将停止其他写入。

我想知道在时间戳(+用户 ID)上使用全局二级索引将有助于减少要扫描的行。但同样,我不想破坏表格,以致其他写入开始失败。

有人可以在 php 中提供速率限制插入/删除示例代码和参考吗?

4

1 回答 1

0

您可以创建一个全局二级索引:

timestampHash (number, between 1 and 100)
timestamp (number)

每当您创建/更新时间戳时,还要将该timestampHash属性设置为 1 到 100 之间的随机数。这将平均分配索引中的项目。您需要此哈希,因为要对 GSI 进行范围查询,您需要一个哈希。按用户 ID 和时间戳进行查询似乎没有意义,因为每次只会返回一项,并且您必须遍历所有用户(假设每个用户 ID 有一项)。

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. 然后在每周结束时,您可以放下桌子。

于 2016-08-31T05:07:52.150 回答