0

主キーがユーザーIDで、タイムスタンプがデータ属性の1つであるdynamodbにデータセットがあります。タイムスタンプが 1 週間よりも古いこのテーブルに対してパージ クエリを実行したいと考えています。

s 単位ごとのすべての書き込みを使い果たしたくありません。理想的には、レート制限の削除操作(php)が必要です。そうしないと、サイズが 10sof GB のデータセットの場合、他の書き込みが停止します。

タイムスタンプ (+ ユーザー ID) でグローバル セカンダリ インデックスを使用すると、スキャンする行を減らすことができるのではないかと考えていました。しかし、繰り返しますが、他の書き込みが失敗し始めるようにテーブルをスラッシングしたくありません。

レート制限の挿入/削除のサンプル コードとこれに対する参照を PHP で提供できますか?

4

1 に答える 1

0

グローバル セカンダリ インデックスを作成できます。

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

タイムスタンプを作成/更新するときはいつでも、timestampHash属性を 1 から 100 までの乱数として設定します。これにより、インデックス内のアイテムが均等に分散されます。GSI で範囲クエリを実行するにはハッシュが必要なため、このハッシュが必要です。ユーザー ID とタイムスタンプによるクエリは、毎回 1 つのアイテムしか返されず、すべてのユーザーをループする必要があるため、意味がないようです (ユーザー ID ごとに 1 つのアイテムがあると仮定します)。

timestampHash次に、各番号とtimestamp1 週間より古いすべてのアイテムに対して 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 に答える