グローバル セカンダリ インデックスを作成できます。
timestampHash (number, between 1 and 100)
timestamp (number)
タイムスタンプを作成/更新するときはいつでも、timestampHash
属性を 1 から 100 までの乱数として設定します。これにより、インデックス内のアイテムが均等に分散されます。GSI で範囲クエリを実行するにはハッシュが必要なため、このハッシュが必要です。ユーザー ID とタイムスタンプによるクエリは、毎回 1 つのアイテムしか返されず、すべてのユーザーをループする必要があるため、意味がないようです (ユーザー ID ごとに 1 つのアイテムがあると仮定します)。
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
. その後、毎週末にテーブルをドロップできます。