web-dev-qa-db-fra.com

Comment résoudre l'erreur de débit pour dynamodb?

Traceback (la dernière sortie de la console):

File "batchpy.py", line 61, in <module>
obj.batch_w1()
File "batchpy.py", line 49, in batch_w1
batch.put_item(data=item)
File "/usr/local/lib/python2.7/dist-packages/boto/dynamodb2/table.py",   line 1641, in __exit__
self.resend_unprocessed()
File "/usr/local/lib/python2.7/dist-packages/boto/dynamodb2/table.py", line 1718, in resend_unprocessed
resp = self.table.connection.batch_write_item(batch_data)
File "/usr/local/lib/python2.7/dist-packages/boto/dynamodb2/layer1.py", line 420, in batch_write_item
body=json.dumps(params))
File "/usr/local/lib/python2.7/dist-packages/boto/dynamodb2/layer1.py", line 2842, in make_request
retry_handler=self._retry_handler)
File "/usr/local/lib/python2.7/dist-packages/boto/connection.py", line 954, in _mexe
status = retry_handler(response, i, next_sleep)
File "/usr/local/lib/python2.7/dist-packages/boto/dynamodb2/layer1.py", line 2876, in _retry_handler
response.status, response.reason, data)
boto.dynamodb2.exceptions.ProvisionedThroughputExceededException:    ProvisionedThroughputExceededException: 400 Bad Request
{u'message': u'The level of configured provisioned throughput for the table was exceeded. Consider increasing your provisioning level with the UpdateTable API', u'__type': u'com.amazonaws.dynamodb.v20120810#ProvisionedThroughputExceededException'}
14
Onkar Kundargi

Il existe 2 façons de gérer ce problème:

  1. Augmentez le niveau de débit (pour cette option, vous devez payer plus).

  2. La façon dont nous devons normalement le faire à certains moments est que nous devons implémenter la logique au niveau de l'application. Par exemple, appelez dynamoDB pour rechercher une exception. Si le débit est dépassé, dormez quelques secondes et appelez à nouveau la même requête (c'est ce que nous avons implémenté dans notre application).

17
Harshal Bulsara

DynamoDB utilise un modèle de débit provisionné pour les lectures et les écritures. Cela signifie que votre application recevra des erreurs si elle essaie d'effectuer plus de lectures ou d'écritures que vous n'en avez allouées à la table.

AWS a fait un certain nombre de choses pour vous aider:

  • Les clients AWS SDK réessayeront automatiquement la demande plusieurs fois avant de voir une exception ProvisionedThroughputExceededException
  • Jusqu'à cinq minutes de capacité inutilisée peuvent être consommées en rafales pour répondre aux pics de demandes
  • Vous pouvez augmenter le nombre de lectures/écritures provisionnées sur une table un nombre illimité de fois par jour (pour effectuer plus de lectures/écritures par seconde)
  • Vous pouvez diminuer le débit provisionné sur une table 9 fois par jour (4 fois dans les 4 premières heures et 1 dans la fenêtre des 4 heures restantes) (pour économiser de l'argent)
  • Vous pouvez utiliser Dynamic DynamoDB , une application tierce, pour gérer automatiquement l'augmentation et la réduction du débit provisionné

Selon le type d'application que vous créez, vous pouvez faire plusieurs choses pour faire face à ces erreurs:

  • Les applications par lots ou à exécution longue peuvent annuler et réessayer ces demandes si elles se produisent pour limiter l'utilisation de la table
  • Lors du chargement en bloc ou de la lecture en bloc à partir d'une table, vous pouvez augmenter manuellement le débit et réduire après avoir terminé
  • Pour une application transactionnelle, vous pouvez vous assurer que votre débit provisionné est supérieur au niveau requis pour exécuter l'application.
  • Utilisez Dynamic DynamoDB ou les modifications de script pour vous-même le débit de table
26
JaredHatfield