2017-09-27 1 views
0

Ich habe gerade begonnen, einige Lambda-Funktionen zu schreiben, mein Problem ist dieses: Ich habe rund 7000 Artikel zu schreiben. Diese Elemente haben zwei Index die primäre die ID und eine sekundäre der Spotname. Um alle diese Funktionen in der DynamoDB mit einem Batch schreibe ich diesen Code schrieb: Leider Gesicht, das ich ein Problem mit dem batchwrite (25 Titel) limit und ich löste es auf folgende Weise:DynamoDb: Tausende Artikel mit geringer Kapazität zu schreiben

for (var j = 0; j < event.length; j++){ 
     if(event[j][0] && event[j][1] && event[j][2] && event[j][3]){ 
      requests.push(new Station(event[j][0],event[j][1],event[j][2],event[j][3])); 
      if(requests.length == 25 || j == (event.length -1)) { // when you have 25 ready.. 
       var params = { 
        RequestItems: { 
         'Stations': requests 
         } 
       }; 
       requests=[]; 
       DynamoDB.batchWrite(params, function(err, data) { 
        if (err){ 
         console.log("Error while batchWrite into dynamoDb"); 
         console.log(err); 
        } 
        else{ 
         console.log("Pushed all the added elements"); 
        } 
       }); 
      } 
     } 
    } 

Jetzt, Ich bemerkte, dass mit einer geringen Kapazität: Tabelle lesen: 5 Schreiben: 5 Spotname-Index Lesen: 5 Schreiben: 5

Ich verwalte, in der Datenbank nur 1500 Datensätze zu schreiben. Irgendwelche Ratschläge?

Antwort

1

Ich hatte dieses Problem, so habe ich es gelöst.

Erhöhen Sie die Kapazität für kurze Zeit. Gelernt ist es stundenweise. Wenn Sie die Kapazität erhöhen, versuchen Sie es innerhalb einer Stunde zu verwenden. Dann bring es runter.

Sie können es nicht mehr als 4 Mal ab sofort herunterbringen. Sie bekommen also 4 mal an einem Tag, um Ihre Kapazität zu reduzieren. Sie können die Schreibkapazität beliebig oft erhöhen.

zweiter Ansatz ist,

Sie die Rate des Schreib zu Dynamo steuern können, so dass Sie Ihren Schreib gleichmäßig über Ihre Fähigkeit zu verbreiten.

Stellen Sie sicher, dass die Kapazität immer höher ist als die durchschnittliche Aufzeichnungskapazität.

Ich hoffe, es hilft.

0

Die Batch-Schreib-API für DynamoDB verwendet weniger Durchsatz. Es ist wirklich beabsichtigt, den Aufwand für die HTTP-Anforderungen beim Senden einer großen Anzahl von Anforderungen an DynamoDB zu reduzieren. Dies bedeutet jedoch, dass eines oder mehrere der Elemente, die versucht wurden, zu schreiben, fehlschlagen können, und es liegt in Ihrer Verantwortung, dies zu erkennen und diese Anfragen erneut zu versuchen. Dies ist wahrscheinlich der Grund, warum einige der Datensätze nicht in der Datenbank landen. Um dieses Problem zu beheben, sollten Sie sich die Antwort auf den Batch-Schreibvorgang ansehen und diese Schreibvorgänge selbst wiederholen.

Im Gegensatz dazu versucht das AWS-SDK automatisch, wenn einzelne Datensätze gleichzeitig eingefügt werden. Wenn Sie wie im obigen Fall einen einzelnen Thread verwenden und nicht auf Batch zugreifen, während Ihre Anforderungen definitiv gedrosselt werden, erhalten sie Zeit für einen erneuten Versuch und Erfolg, was die Ausführung verlangsamt und den Durchsatz der Tabelle niedrig hält.

Die bessere Option ist es, den Schreibdurchsatz der Tabelle vorübergehend auf einen höheren Wert zu erhöhen, der ausreicht, um die Massenlast zu unterstützen. Für dieses Beispiel würde ich einen Wert zwischen 50 und 100 schreiben. Eine einzelne Threading-Ladeoperation wird wahrscheinlich durch die Round-Trip-Zeit für die DynamoDB-API unter diesen Zahlen begrenzt. Zum Laden von nur 7000 Elementen würde ich empfehlen, die Batch-Schreib-API zu vermeiden, da Sie die Wiederholungslogik selbst implementieren müssen. Wenn Sie jedoch viel mehr Daten laden oder die Last in kürzerer Zeit benötigen, kann die Batch-API eine 25-fache Leistungsverbesserung des HTTP-Overhead erzielen, vorausgesetzt, Sie werden nicht gedrosselt.

Verwandte Themen