【问题标题】:How to solve throughput error for dynamodb?如何解决 dynamodb 的吞吐量错误?
【发布时间】:2015-07-17 04:25:44
【问题描述】:

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

【问题讨论】:

    标签: amazon-dynamodb


    【解决方案1】:

    DynamoDB 使用预配置的吞吐量模型进行读取和写入。这意味着如果您的应用程序尝试执行比您分配给表的更多的读取或写入操作,它将收到错误。

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

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

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

    【讨论】:

    • 特别是对于 BatchWrite API,您还需要检查对批处理调用的响应,因为其中有一个名为 UnprocessedItems 的字段,它是受限制的项目。理想情况下,您只想重新批处理未处理的项目,并继续循环直到它为空。这与现在发生的情况之间的区别在于您的整个批处理写入调用都被限制了。我建议您提高吞吐量,尽管这取决于您计划消耗多少 WCU(KB/秒)。
    • 您可以每天将吞吐量降低 9 次(前 4 小时减少 4 次,随后的 4 小时窗口中的每个减少 1 次)。在未登录 SO 的情况下编辑了答案。 :(
    【解决方案2】:

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

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

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

    【讨论】:

    • #2 是一个不错的解决方案,但是在将最大超时限制为 300 秒的 lambda 函数中运行此方法怎么样?
    • @user2976753,当它与 lambda 函数一起添加时,这可能不是一个好的解决方案。这个逻辑需要在调用之前实现。
    • 这可能很有趣aws.amazon.com/blogs/aws/…
    猜你喜欢
    • 2019-02-05
    • 2018-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-09-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多