我在 dynamodb 中有数据集,其主键是用户 ID,时间戳是数据属性之一。我想在这个表上运行一个清除查询,其中时间戳早于 1 周。
我不想吃掉每 s 单位的所有写入。理想情况下,我想要一个速率限制删除操作(在 php 中)。否则对于大小为 10sof GB 的数据集,它将停止其他写入。
我想知道在时间戳(+用户 ID)上使用全局二级索引将有助于减少要扫描的行。但同样,我不想破坏表格,以致其他写入开始失败。
有人可以在 php 中提供速率限制插入/删除示例代码和参考吗?
我在 dynamodb 中有数据集,其主键是用户 ID,时间戳是数据属性之一。我想在这个表上运行一个清除查询,其中时间戳早于 1 周。
我不想吃掉每 s 单位的所有写入。理想情况下,我想要一个速率限制删除操作(在 php 中)。否则对于大小为 10sof GB 的数据集,它将停止其他写入。
我想知道在时间戳(+用户 ID)上使用全局二级索引将有助于减少要扫描的行。但同样,我不想破坏表格,以致其他写入开始失败。
有人可以在 php 中提供速率限制插入/删除示例代码和参考吗?
您可以创建一个全局二级索引:
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
. 然后在每周结束时,您可以放下桌子。