2

我正在使用 AWS SDK for Javascript (Node.js) 从 DynamoDB 表中读取数据。Auto Scaling 功能在大部分时间都做得很好,并且消耗的读取容量单位 (RCU) 在一天的大部分时间里都非常低。但是,有一个在午夜左右执行的已编程作业消耗了大约 10 倍于预置 RCU 的消耗,并且由于自动缩放需要一些时间来调整容量,因此存在大量受限制的读取请求。此外,我怀疑我的请求没有完成(尽管我在错误日志中找不到任何异常)。

为了处理这种情况,我考虑过使用 AWS API ( updateTable ) 增加预置的 RCU,但计算我的应用程序需要的 RCU 数量可能并不简单。

所以我的第二个猜测是重试失败的请求并等待自动缩放增加预置的 RCU。正如 AWS 文档和一些 Stack Overflow 答案所指出的(特别是关于ProvisionedThroughputExceededException):

适用于 Amazon DynamoDB 的 AWS 开发工具包会自动重试收到此异常的请求。因此,您的请求最终会成功,除非请求太大或您的重试队列太大而无法完成。

我读过类似的问题(这个这个这个),但我仍然感到困惑:如果请求太大或重试队列太大而无法完成(因此在自动重试之后)是否会引发此异常或实际上在重试之前?

最重要的是:这是我在我的上下文中应该期待的例外吗?(所以我可以抓住它并重试,直到自动缩放增加 RCU?)

4

1 回答 1

8

是的。

每次您的应用程序发送超出您容量的请求时,您都会从 Dynamo 收到 ProvisionedThroughputExceededException 消息。但是,您的 SDK 会为您处理并重试。默认 Dynamo 重试时间从 50ms 开始,默认重试次数为 10,默认退避为指数。

这意味着您可以在以下位置重试:

  • 50毫秒
  • 100毫秒
  • 200毫秒
  • 400毫秒
  • 800毫秒
  • 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 秒才能完成。

于 2017-12-29T15:53:52.210 回答