2017-12-29 16 views
1

Ich verwende AWS SDK für Javascript (Node.js), um Daten aus einer DynamoDB-Tabelle zu lesen. Die automatische Skalierungsfunktion macht während der meisten Zeit eine gute Arbeit und die verbrauchten Read Capacity Units (RCU) sind wirklich den geringsten Teil des Tages. Es gibt jedoch einen programmierten Job, der um Mitternacht ausgeführt wird, was etwa das 10-fache der bereitgestellten RCU erfordert, und da die automatische Skalierung einige Zeit benötigt, um die Kapazität anzupassen, gibt es viele gedrosselte Leseanforderungen. Außerdem vermute ich, dass meine Anfragen nicht abgeschlossen werden (obwohl ich in meinem Fehlerprotokoll keine Ausnahmen finden kann).Was ist zu tun, wenn der bereitgestellte Durchsatz überschritten wird?

Um diese Situation zu behandeln, habe ich erwogen, die bereitgestellte RCU mithilfe der AWS-API (updateTable) zu erhöhen, aber die Berechnung der Anzahl der RCU, die meine Anwendungen benötigen, ist möglicherweise nicht einfach.

Also meine zweite Schätzung war, fehlgeschlagene Anfragen zu wiederholen und warten Sie einfach auf automatische Skalierung erhöhen Sie die bereitgestellten RCU. Wie von AWS-Dokumentation und einige Stack-Überlauf Antworten darauf hingewiesen (particularlly über ProvisionedThroughputExceededException):

Die AWS SDKs für Amazon DynamoDB automatisch Anfragen wiederholen, die diese Ausnahme erhalten. Daher ist Ihre Anforderung letztendlich erfolgreich, es sei denn, die Anforderung ist zu groß oder die Wiederholungswarteschlange ist zu groß, um sie zu beenden.

Ich habe ähnliche Fragen gelesen (this one, this one und this one), aber ich bin immer noch verwirrt: Diese Ausnahme wird ausgelöst, wenn die Anforderung zu groß ist oder die Wiederholungswarteschlange zu groß zu beenden (also nach dem automatischen Wiederholungen) oder tatsächlich vor den Wiederholungen?

Am wichtigsten: ist das die Ausnahme, die ich in meinem Kontext erwarten sollte? (So ​​kann ich es abfangen und es erneut versuchen, bis die automatische Skalierung die RCU erhöht?)

Antwort

2

Ja.

Jedes Mal, wenn Ihre Anwendung eine Anfrage sendet, die Ihre Kapazität überschreitet, erhalten Sie die Meldung ProvisionedThroughputExceededException von Dynamo. Ihr SDK handhabt dies jedoch für Sie und versucht es erneut. Die standardmäßige Dynamo-Wiederholungszeit beginnt bei 50 ms, die Standardanzahl der Wiederholungen beträgt 10 und das Backoff-Intervall ist standardmäßig exponentiell.

Das heißt, Sie Wiederholungen abrufen:

  • 50ms
  • 100ms
  • 200ms
  • 400ms
  • 800ms
  • 1,6s
  • 3,2s
  • 6.4s
  • 12.8s
  • 25.6s

Wenn nach dem Ihre Anfrage 10. Wiederholung wurde Ihrer Anwendung noch nicht gelungen, übergibt das SDK die ProvisionedThroughputExceededException zurück und Sie können damit umgehen, wie Sie möchten.

Sie könnten damit umgehen, indem Sie die Durchsatzbereitstellung erhöhen. Eine andere Option wäre jedoch, die Standardwiederholungszeiten beim Erstellen der Dynamo-Verbindung zu ändern. Zum Beispiel

new AWS.DynamoDB({maxRetries: 13, retryDelayOptions: {base: 200}}); 

Dies würde bedeuten, dass Sie 13 Mal versuchen, mit einer anfänglichen Verzögerung von 200ms. Dies würde Ihrer Anfrage eine Gesamtzahl von 819.2s anstelle von 25.6s geben.

Verwandte Themen