通过 php 中的速率限制清除 dynamo db 中的旧数据

Purge old data in dynamo db by rate limiting in php

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

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

我想知道在时间戳(+用户 ID)上使用全局二级索引是否有助于减少要扫描的行。但同样,我不想因为其他写入开始失败而崩溃 table。

有人可以在 php 中提供速率限制 insert/delete 示例代码和参考吗?

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

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

每当您 create/update 您的时间戳时,也将 timestampHash 属性设置为 1 到 100 之间的随机数。这将均匀分布索引中的项目。您需要此散列,因为要在 GSI 上执行范围查询,您需要一个散列。按用户 ID 和时间戳查询似乎没有意义,因为每次只会 return 一项,你将不得不遍历所有用户(假设每个用户 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。

TABLE_08292016
TABLE_09052016
TABLE_09122016

2016 年 8 月 28 日这一周的所有数据都将进入 TABLE_08292016。然后在每周结束时,您可以删除 table.