我正在使用适用于 Javascript (Node.js) 的 AWS 开发工具包从 DynamoDB 表中读取数据。自动缩放功能在大部分时间都表现出色,并且消耗的读取容量单位 (RCU) 在一天中的大部分时间都非常低。然而,有一个在午夜左右执行的编程作业消耗了大约 10 倍的预配置 RCU,并且由于自动缩放需要一些时间来调整容量,因此存在大量受限的读取请求。此外,我怀疑我的请求没有完成(尽管我在错误日志中找不到任何异常)。
为了处理这种情况,我考虑使用 AWS API 增加预配置的 RCU(更新表 http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/DynamoDB.html#updateTable-property)但计算我的应用程序所需的 RCU 数量可能并不简单。
因此,我的第二个猜测是重试失败的请求,然后等待自动扩展增加预配置的 RCU。正如 AWS 文档和一些 Stack Overflow 答案所指出的(特别是关于配置吞吐量超出异常):
适用于 Amazon DynamoDB 的 AWS 开发工具包会自动重试收到此异常的请求。因此,您的请求最终会成功,除非请求太大或者您的重试队列太大而无法完成。
我读过类似的问题(this one https://stackoverflow.com/questions/45193240/dynamodb-when-does-provisionedthroughputexceededexception-raise, this one https://stackoverflow.com/questions/13756952/repeating-throttled-dynamodb-requests/13780368#13780368 and this one https://stackoverflow.com/questions/42182219/dynamodb-provisioned-capacity-throttling-vs-failure/42183632#42183632)但我仍然很困惑:如果请求太大或重试队列太大而无法完成(因此在自动重试之后)或实际上在重试之前,是否会引发此异常?
最重要的:这是我在我的上下文中应该期待的例外吗? (这样我就可以捕获它并重试,直到自动缩放增加 RCU?)
Yes.
每次您的应用程序发送超出您容量的请求时,您都会从 Dynamo 收到 ProvisionedThroughputExceededException 消息。但是,您的 SDK 会为您处理此问题并重试。默认 Dynamo 重试时间从 50ms 开始,默认重试次数为 10,默认退避为指数。
这意味着您可以在以下位置重试:
- 50ms
- 100ms
- 200ms
- 400ms
- 800ms
- 1.6s
- 3.2s
- 6.4s
- 12.8s
- 25.6s
如果第 10 次重试后您的请求仍未成功,SDK 会将 ProvisionedThroughputExceededException 传递回您的应用程序,您可以按照自己的方式处理它。
您可以通过增加吞吐量配置来处理它,但另一种选择是在创建 Dynamo 连接时更改默认重试次数。例如
new AWS.DynamoDB({maxRetries: 13, retryDelayOptions: {base: 200}});
这意味着您重试 13 次,初始延迟为 200 毫秒。这将使您的请求总共需要 819.2 秒才能完成,而不是 25.6 秒。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)