LoginSignup
0
0

More than 3 years have passed since last update.

DynamoDBのUpdate性能の落とし穴

Last updated at Posted at 2019-06-11

作業環境

PHP5.3 + CentOS 7 + AWS Cli DynamoDB

前提条件

①DynamoDBへのクエリ操作は基本Paginated(検索結果がページ単位でもどってくる)だ。一回800件にしよう!

この通り、DynamoDBに複数件データの更新は不可能、ループで一件ずつ更新するほかありません。現状自分の環境では、一件データの処理更新あたりに1秒がかかります。

③DynamoDBに新データが常に発生する。今回は実行時点で対象データが1000件とします。

作業内容

作業で、aws cliでDynamoDBの対象テーブルにクエリをかけ、取得した対象データを処理してから、当該データのステータスを更新するバッチを作成する。

対象データを全部処理するつもりで、①のクエリ結果に、続きがあるよ!と示す「"LastEvaluatedKey"」がなくなるまで、無限ループで実装してます。

問題

つまり、プログラムのイメージは

while(前の①のレスポンスに「LastEvaluatedKey」が存在){
    ①(クエリ)
    foreach(List as obj){
        処理…
        ②(Update)
    }
}

↑の実行時間を考えると、1クエリ(1ページ)が800件の場合、whileが一周廻る時間は約800秒=13分20秒を要する。whileが一周廻る間、もし新たな対象データがDynamoDBに登録されると、次に終わるはずのwhileループがもう一周伸びることになる。

本番運用上↑の状況が起こる懸念が残ります。

対策

対策本当にある?上記の状況が起きてしまう場合、現実的ないい対策が見当たらない想定です。理由は、こうなる際、データ発生スピード>データ消化スピードからです。今の段階で、データ発生スピードが1000/Day以内の話を聞いたので、まずは大丈夫だが。将来大量のデータの業務が発生の場合、AmazonがBatchUpdateItem見たいな操作をリリースしてくれると助かります。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0