超出预配置吞吐量时应该怎么做?

问题描述 投票:2回答:1

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

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

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

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

我已经阅读了类似的问题(this onethis onethis one),但我仍然感到困惑:如果请求太大或重试队列太大而无法完成(因此在自动重试之后)或实际在重试?

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

node.js amazon-web-services amazon-dynamodb aws-sdk-js
1个回答
5
投票

是。

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

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

  • 50毫秒
  • 100毫秒
  • 200毫秒
  • 400毫秒
  • 800毫秒
  • 1.6秒
  • 3.2S
  • 6.4s
  • 12.8S
  • 25.6s

如果在第10次重试之后您的请求仍未成功,则SDK会将ProvisionedThroughputExceededException传递回您的应用程序,您可以按照自己喜欢的方式处理它。

您可以通过增加吞吐量配置来处理它,但另一个选项是在创建Dynamo连接时更改默认重试次数。例如

new AWS.DynamoDB({maxRetries: 13, retryDelayOptions: {base: 200}});

这意味着你重试13次,初始延迟为200ms。这将使您的请求总共需要819.2秒而不是25.6秒。

© www.soinside.com 2019 - 2024. All rights reserved.