2017-03-24 1 views
0

Ich versuche, große Mengen von Daten mit AmazonDynamoDBAsyncClient auf Dynamo zu schreiben, und ich versuche zu verstehen, was die beste Praxis der Handhabung von Throttling ist?Wie DynamoDb erneut versuchen zu schreiben, wenn gedrosselt?

Zum Beispiel habe ich eine Kapazität von 3000 schreibt und zu einem bestimmten Zeitpunkt habe ich, sagen wir, 100.000 Datensätze, die ich gerne schreiben würde. Ich brauche sie nicht alle sofort, aber ich versuche herauszufinden, wie der beste Weg ist, sie zu bekommen.

Diese Anwendung läuft in einer verteilten Umgebung, so dass möglicherweise 5 Executoren gleichzeitig versuchen, dies zu tun. Wäre der beste Weg, damit umzugehen, dieser Weg? Wo sollte ich den Schreibprozess schlafen, sollten wir Gas geben? Oder sollte ich etwas tun, um die Drossel vollständig zu vermeiden. Tatsächlich macht mein Code sogar, was ich denke, es ist der Versuch, die Daten nach einer Sekunde erneut zu versuchen?

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

Eigentlich habe ich vielleicht gerade gelernt, dass es sich automatisch um Versuche handelt. Kann jemand bestätigen? –

+1

Was Sie brauchen, kann ein Scheduler sein, sind Sie mit Akka vertraut? Sie können einen Akteur erstellen, der dies tut, wenn der Versuch fehlschlägt, sendet der Akteur in 1 Sekunde eine Nachricht an sich selbst und erinnert sich daran, es erneut zu versuchen. Oder Sie können einfach dieses [gist] (https://gist.github.com/viktorklang/9414163) verwenden, nämlich das 'retry'-Muster. –

+0

Ich bin nicht vertraut, aber ich habe von Akka gehört. Ich werde auf diese beiden Optionen eingehen. Danke für Ihre Hilfe. –

Antwort

0

Das AWS SDK für Java gedrosselt erneut versuchen fordert 10 mal standardmäßig vor ein ProvisionedThroughputExceededException werfen. Wenn Ihre Objekte klein sind (1 KB oder weniger) und Sie die Schreibvorgänge von EC2 in derselben Region wie Ihre Tabelle ausführen, können Sie davon ausgehen, dass jeder Schreibvorgang ungefähr 10 ms dauert. Das bedeutet, dass jeder Verarbeitungsvorgang etwa 100 Schreibvorgänge pro Sekunde ausführen kann. Um Ihre Schreibvorgänge auf 3000 Schreibvorgänge pro Sekunde zu skalieren, benötigen Sie 30 Threads und 30 HTTP-Verbindungen. 3000 kleine (1 kB) Schreibvorgänge pro Sekunde bedeuten einen Datendurchsatz von 2,92 MB pro Sekunde. Daher scheint es für diese Schreiblast nicht so, dass die EC2-Hardware zu einem Engpass werden könnte. Ich empfehle Ihnen, einige Messungen durchzuführen, um herauszufinden, wie lange es dauert, um jedes Ihrer Elemente im Durchschnitt zu schreiben, und Ihre Threads und HTTP-Verbindungen entsprechend zu skalieren.

Verwandte Themen