#作業環境
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見たいな操作をリリースしてくれると助かります。