如何解决dynamodb的吞吐量误差?

时间:2015-07-17 04:25:44

标签: amazon-dynamodb

Traceback(控制台的最后一个输出):

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'}

2 个答案:

答案 0 :(得分:25)

DynamoDB使用预配置吞吐量模型进行读取和写入。这意味着如果您的应用程序尝试执行的读取或写入次数超过分配给表格的次数,则会收到错误。

AWS已经做了很多事情来帮助解决这个问题:

  • AWS SDK客户端会在您看到ProvisionedThroughputExceededException之前多次自动重试请求
  • bursts中可以使用最多五分钟的未使用容量以容纳请求中的峰值
  • 您可以每天无限次地增加表上的预配置读/写次数(每秒执行更多的读/写)
  • 您可以减少表9 times a day (4 times in the first 4 hours, and 1 each in the rest 4 hours window)上的预配置吞吐量(以节省费用)
  • 您可以使用Dynamic DynamoDB(第三方应用)自动管理扩展和降低预配置吞吐量

根据您正在创建的应用类型,您可以采取以下措施来处理这些错误:

  • 批量或长时间运行的应用程序可以退出并重试这些请求(如果它们发生以限制表使用情况)
  • 从表中批量加载或批量读取时,您可以手动扩大吞吐量并在完成后缩小
  • 对于事务性应用程序,您可以确保将预配置吞吐量高于运行应用程序所需的级别
  • 自行使用Dynamic DynamoDB或脚本更改表吞吐量

答案 1 :(得分:15)

有两种方法可以解决这个问题:

  1. 提高吞吐量水平(对于此选项,您需要支付更多费用)。

  2. 通常我们在某些方面必须做的事情是我们需要在应用程序级别实现逻辑。例如,调用dynamoDB来检查异常。如果超过吞吐量,请休眠几秒钟并再次调用相同的查询(这是我们在应用程序中实现的)。