Amazon dynamodb 如何解决dynamodb的吞吐量错误?

Amazon dynamodb 如何解决dynamodb的吞吐量错误?,amazon-dynamodb,Amazon Dynamodb,回溯(控制台的最后输出): 文件“batchpy.py”,第61行,在 对象批次_w1() 文件“batchpy.py”,第49行,在batch_w1中 批处理放置项目(数据=项目) 文件“/usr/local/lib/python2.7/dist-packages/boto/dynamodb2/table.py”,第1641行,在__ self.ressend_未处理() 文件“/usr/local/lib/python2.7/dist packages/boto/dynamodb2/tabl

回溯(控制台的最后输出):

文件“batchpy.py”,第61行,在
对象批次_w1()
文件“batchpy.py”,第49行,在batch_w1中
批处理放置项目(数据=项目)
文件“/usr/local/lib/python2.7/dist-packages/boto/dynamodb2/table.py”,第1641行,在__
self.ressend_未处理()
文件“/usr/local/lib/python2.7/dist packages/boto/dynamodb2/table.py”,第1718行,未经处理
resp=self.table.connection.batch\u write\u项(批处理数据)
文件“/usr/local/lib/python2.7/dist packages/boto/dynamodb2/layer1.py”,第420行,在批写入项中
body=json.dumps(参数))
文件“/usr/local/lib/python2.7/dist packages/boto/dynamodb2/layer1.py”,第2842行,在make_请求中
retry\u handler=self.\u retry\u handler)
文件“/usr/local/lib/python2.7/dist-packages/boto/connection.py”,第954行,在
状态=重试\u处理程序(响应、i、下一个\u睡眠)
文件“/usr/local/lib/python2.7/dist packages/boto/dynamodb2/layer1.py”,第2876行,在“重试”处理程序中
响应。状态、响应。原因、数据)
boto.dynamodb2.exceptions.ProvisionedThroughPutteExceedeDexception:ProvisionedThroughPutteExceedexception:400错误请求
{U'Meult:U'消息:超出了配置表的配置吞吐量级别。考虑使用可更新的API“U”类型增加您的配置级别:U'COM.AxoNavaStudioDB。

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

  • 提高吞吐量水平(对于此选项,您必须支付更多费用)

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


  • DynamoDB对读取和写入都使用一个已配置的吞吐量模型。这意味着,如果应用程序尝试执行的读写次数超过了分配给表的次数,则会收到错误

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

    • AWS SDK客户端将自动重试该请求数次,然后才能看到ProvisionedThroughPuteExceedeDexception
    • 在中最多可以消耗五分钟的未使用容量,以适应请求的峰值
    • 您可以每天无限次地增加表上的已设置读/写次数(以每秒执行更多读/写)
    • 您可以减少表上已配置的吞吐量(以节省资金)
    • 您可以使用第三方应用程序自动管理所提供吞吐量的上下扩展
    根据您正在创建的应用程序类型,您可以采取以下几项措施来处理这些错误:

    • 批处理或长时间运行的应用程序可以回退并重试这些请求(如果发生这些请求以限制表的使用)
    • 当从表中批量加载或批量读取时,您可以手动放大吞吐量并在完成后缩小
    • 对于事务性应用程序,您可以确保所配置的吞吐量高于运行应用程序所需的水平
    • 自己使用动态DynamoDB或脚本更改表吞吐量

    特别是对于BatchWrite API,您还需要检查对批处理调用的响应,因为其中有一个名为UnprocessedItems的字段,该字段是受限制的项。理想情况下,您只需重新批处理未处理的项目,并保持循环,直到其为空。这与现在发生的不同之处在于,整个batchwrite调用都被限制。我建议您拨高吞吐量,尽管这取决于您计划使用多少WCU(KB/秒)。您可以每天减少吞吐量9次(前4小时减少4次,后4小时窗口每天减少1次)。在未登录SO的情况下编辑了答案:(#2是一个很好的解决方案,但是在最大超时时间限制为300秒的lambda函数中运行这种方法怎么样?@user2976753,当它添加lambda函数时,这可能不是一个好的解决方案。在调用它之前需要实现这个逻辑。这可能很有趣
    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'}