1. ホーム
  2. database

[解決済み] DynamoDBから大量のアイテムを削除したいのですが、おすすめの方法はありますか?

2022-03-16 15:11:15

質問

DynamoDBで簡単なロギングサービスを書いています。

私はuser_idハッシュとタイムスタンプ(Unixエポックint)範囲をキーとするlogsテーブルを持っています。

サービスのユーザーがアカウントを終了するとき、私は範囲の値に関係なく、テーブル内のすべてのアイテムを削除する必要があります。

このような操作を行うには、どのような方法が推奨されますか(削除する項目が数百万件になる可能性があることを念頭に置いてください)?

私が見た限りでは、選択肢は以下の通りです。

A: スキャン操作を実行し、返されたアイテムごとに、アイテムがなくなるまで削除を呼び出します。

B: BatchGetオペレーションを実行し、アイテムがなくなるまで各アイテムの削除を再度呼び出す

どちらも時間がかかるので、私には酷に見えます。

私が理想とするのは、LogTable.DeleteItem(user_id) - 範囲を指定せずに呼び出し、私のためにすべてを削除させることです。

どのように解決するのですか?

<ブロッククオート

私が理想とするのは、LogTable.DeleteItem(user_id) - を呼び出すことです。 範囲を指定せずに、すべてを削除してくれます。

このような高度な操作は、AWSチームによって時間をかけて追加されるかもしれないと想像できます(彼らは最初に限られた機能セットから始めて、顧客のフィードバックに基づいて拡張を評価する歴史を持っています)。しかし、少なくともフルスキャンのコストを避けるために、ここであなたがすべきことは何でしょうか。

  1. 使用方法 クエリ よりも スキャン の全項目を取得するために user_id - これは、ハッシュと範囲を組み合わせた主キーが使われているかどうかに関係なく動作します。 ハッシュキー値 RangeKeyCondition は本APIでは別のパラメータであり、前者が対象とするのは 複合主キーのハッシュコンポーネントの属性値。 .

    • ここでは、通常通りクエリ API のページングを処理する必要があることに注意してください。 ExclusiveStartKey パラメータを使用します。

      以前のクエリの続きとなる項目の主キー。以前の 以前のクエリがLastEvaluatedKeyとして提供された場合、そのクエリはこの値を提供することがあります。 クエリ操作が完了する前に中断された場合。 結果セットのサイズまたは Limit パラメータが原因。この 新しいクエリリクエストでLastEvaluatedKeyを渡すと、そのクエリリクエストを継続することができます。 を使用することで、その時点からの操作を行うことができます。

  2. 返されたすべての項目をループし、どちらかを促進する 項目削除 通常通り

    • 更新情報 : 可能性が高い BatchWriteItem の方がこのような使用例には適しています(詳しくは以下をご覧ください)。

更新情報

で強調したように アイバント は、その BatchWriteItem 操作 を置くことができます。 または削除 1回のAPIコールで複数のテーブルにまたがる複数のアイテム [強調]。 :

1つのアイテムをアップロードするにはPutItem APIを、1つのアイテムを削除するには の場合、DeleteItem APIを使用することができます。しかし 大量のデータをアップロードしたり、削除したりする場合。 Amazon Elastic MapReduce (EMR)からのデータ移行や、他のアプリケーションからのデータ移 このAPIは、Amazon DynamoDBにデータベースを導入するための効率的な方法を提供します。 の代替となります。

なお、これにはまだいくつかの関連する制限があります。

  • 1回のリクエストで可能な最大操作 - putまたはdelete操作は合計25個まで指定できます。ただし、リクエストの合計サイズは1MB(HTTPペイロード)を超えることはできません。

  • アトミック操作ではありません - BatchWriteItemで指定された個々の操作はアトミックですが、BatchWriteItemは全体として"best-effort"操作であり、アトミック操作ではありません。つまり、BatchWriteItemのリクエストの中で、ある操作は成功するかもしれないし、ある操作は失敗するかもしれない。[...]

しかし、このことは、今回のようなユースケースにおいて、明らかに大きな利益をもたらす可能性があります。