2017-03-24 6 views
0

Amazon DynamoDBAsyncClientを使用して大量のデータをDynamoに書き込もうとしていますが、スロットル処理のベストプラクティスが何であるかを理解しようとしていますか?スロットル時にDynamoDbの書き込みを再試行する方法は?

たとえば、私は3000の書き込み容量を持っており、与えられた瞬間には、私が書きたいと思う100,000のレコードがあります。私はすぐにそれらをすべて必要としませんが、私はそれらを得るための最良の方法が何であるか把握しようとしています。

このアプリケーションは分散環境で実行されているため、5人のエグゼキュータがすべて同時にこの操作を実行しようとしています。このようにこれを処理する最良の方法はありますか?私が眠っている場所では、書き込みプロセスがスロットルに当たっていますか?または、スロットルを完全に避けるために何かをしなければなりません。実際には、私のコードは私が思っていることをしています、それは秒を待ってからデータを再試行していますか?

try{ 
    amazonDynamoAsyncDb.updateItemAsync(updateRequest) 
    }catch{ 
    case e: ThrottlingException => { 
     Thread.sleep(1000) 
     //retry here, but how? 
     } 
    } 
+0

実際、私は自力で自動的に再試行することを知りました。誰でも確認できますか? –

+1

あなたが必要とするのはスケジューラかもしれません、あなたはAkkaに精通していますか?これを行うアクターを作成することができます。試行が失敗した場合、アクターは1秒後に自分自身にメッセージを送信して、再度試みるように思い出させます。あるいは、この[gist](https://gist.github.com/viktorklang/9414163)、つまり 'retry'パターンを使うことができます。 –

+0

私はおなじみではありませんが、私はAkkaについて聞いたことがあります。私はそれらの2つのオプションを調べます。ご協力ありがとうございました。 –

答えて

0

Java用AWS SDKはProvisionedThroughputExceededExceptionを投げる前に、デフォルトで絞ら要求を10回再試行します。あなたのアイテムが小さく(1KB以下)、あなたのテーブルと同じ地域のEC2からの書き込みを実行している場合は、各書き込みに約10ミリ秒かかります。これは、処理の各スレッドが1秒あたり約100回の書き込みを実行できることを意味します。書き込みを1秒あたり3000件の書き込みに合わせるには、30個のスレッドと30個のHTTP接続が必要です。 1秒当たり3000小さい(1kb)書き込みは、毎秒2.92MBのデータスループットに変換されます。したがって、この書き込み負荷では、EC2ハードウェアがボトルネックになる可能性はありません。平均的に各アイテムを書くのにどれくらいの時間がかかるかを把握し、スレッドとHTTP接続を適切に調整するためにいくつかの測定を行うことをお勧めします。

関連する問題