通过 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.
我在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.