2017-09-27 2 views
0

Je viens de commencer à écrire des fonctions Lambda, mon problème est celui-ci: J'ai environ 7000 articles à écrire. Ces éléments ont deux index le primaire l'id et un secondaire le nom du spot. Pour écrire toutes ces fonctions dans le DynamoDB avec une écriture de lot i écrit ce code: Malheureusement je fais face à un problème avec le batchwrite (25 points limite) et je résolus de la manière suivante:DynamoDb: Des milliers d'éléments à écrire avec une faible capacité

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"); 
        } 
       }); 
      } 
     } 
    } 

Maintenant, J'ai remarqué que, avec une faible capacité: table de lecture: 5 Ecrire: 5 SPOTname-index Lire: 5 Ecrire: 5

je parviens à écrire dans la base de données 1500 enregistrements. Un conseil?

Répondre

1

J'ai eu ce problème, voici comment je l'ai résolu.

Augmentez la capacité pendant une courte période. Appris c'est à l'heure. Si vous augmentez la capacité, essayez de l'utiliser en une heure. Puis le ramener.

Vous ne pouvez pas le faire descendre plus de 4 fois à partir de maintenant. Donc, vous obtenez 4 fois par jour pour réduire votre capacité. Vous pouvez augmenter la capacité d'écriture autant de fois que vous le souhaitez.

deuxième approche est,

Vous pouvez contrôler la vitesse d'écriture à Dynamo, de sorte que vous étalez vos écritures de manière uniforme sur votre capacité.

Assurez-vous que la capacité d'écriture est toujours supérieure à la capacité d'enregistrement moyenne entrante.

Espérons que ça aide. L'utilisation de l'API d'écriture par lots pour DynamoDB n'utilise pas réellement moins de débit.

0

Il est vraiment destiné à réduire le surcoût pour les requêtes HTTP lors de l'envoi d'un grand nombre de requêtes à DynamoDB. Cependant, cela signifie qu'un ou plusieurs des éléments qui ont été tentés d'être écrits peuvent échouer et il est de votre responsabilité de le détecter et de réessayer ces requêtes. C'est probablement pourquoi certains des enregistrements ne finissent pas dans la base de données. Pour résoudre ce problème, vous devriez regarder la réponse à l'écriture par lots et réessayer ces écritures vous-même.

Par contre, lorsque vous insérez des enregistrements individuels à la fois, le kit AWS SDK réessaie automatiquement. Si vous utilisez un seul thread comme dans le cas ci-dessus et que vous n'utilisez pas batch alors que vos requêtes seront définitivement limitées, vous aurez le temps de réessayer et de réussir, ce qui ralentit l'exécution tout en réduisant le débit de la table.

La meilleure option consiste à augmenter temporairement le débit d'écriture de la table à une valeur plus élevée suffisante pour prendre en charge la charge en bloc. Pour cet exemple, je recommanderais une valeur entre 50 et 100 écritures. Une opération de chargement à un seul thread sera probablement limitée par le temps d'aller-retour à l'API DynamoDB bien en dessous de ces nombres. Pour le chargement de seulement 7000 articles, je vous recommande d'éviter l'API d'écriture par lots, car elle nécessite l'implémentation de la logique de nouvelle tentative. Cependant, si vous chargez beaucoup plus de données ou que vous avez besoin de la charge pour terminer en moins de temps, l'API par lots peut vous apporter une amélioration théorique des performances de 25 fois sur le protocole HTTP en supposant que vous n'êtes pas limité.