我正在使用适用于Java的AWS开发工具包(Node.js)从DynamoDB表读取数据。自动缩放功能在大部分时间里都表现出色,并且一天中大部分时间消耗的读取容量单位(RCU)确实很低。但是,有一个编程的作业在午夜左右执行,消耗的内存约为预配置RCU的10倍,并且由于自动缩放需要花费一些时间来调整容量,因此有许多限制的读取请求。此外,我怀疑我的请求没有完成(尽管我在错误日志中找不到任何异常)。
为了处理这种情况,我曾考虑过使用AWS API(updateTable)增加预配置的RCU,但计算应用程序所需的RCU数量可能并不简单。
因此,我的第二个猜测是重试失败的请求,然后只是等待自动扩展增加已配置的RCU。正如AWS文档和一些堆栈溢出答案所指出的(尤其是关于 ProvisionedThroughputExceededException ):
适用于Amazon DynamoDB的AWS开发工具包会自动重试收到此异常的请求。因此,您的请求最终将成功,除非请求太大或重试队列太大而无法完成。
但是我还是很困惑:如果请求太大或重试队列太大而无法完成(因此在自动重试之后),会引发此异常吗?实际在重试之前?
最重要的是: 这是我在上下文中应该期待的例外吗?(所以我可以捕获它并重试,直到自动缩放增加RCU为止?)
是。
每次您的应用程序发送的请求超出您的能力时,您都会从Dynamo中获得ProvisionedThroughputExceededException消息。但是,您的SDK会为您处理此问题,然后重试。Dynamo的默认重试时间开始于50ms,默认重试次数为10,默认情况下,补偿是指数级的。
这意味着您可以在以下位置重试:
如果在第10次重试后您的请求仍然没有成功,则SDK会将ProvisionedThroughputExceededException传递回您的应用程序,您可以按照自己的意愿进行处理。
您可以通过增加吞吐量来处理它,但是另一种选择是在创建Dynamo连接时更改默认重试时间。例如
new AWS.DynamoDB({maxRetries: 13, retryDelayOptions: {base: 200}});
这意味着您重试13次,初始延迟为200ms。这将使您的请求总共完成819.2s,而不是25.6s。