我正在使用awssdkforjavascript(node.js)从dynamodb表读取数据。自动缩放功能在大部分时间内都做得很好,而且一天中大部分时间消耗的读取容量单位(RCU)都很低。然而,有一个编程的作业在午夜执行,它消耗大约10倍的资源控制单元,并且由于自动缩放需要一些时间来调整容量,因此有很多限制读取请求。此外,我怀疑我的请求没有完成(尽管我在错误日志中找不到任何异常)。
为了处理这种情况,我考虑使用aws api(updateTable)增加配置的rcu,但是计算我的应用程序需要的rcu的数量可能并不简单。
所以我的第二个猜测是重试失败的请求,并简单地等待自动伸缩增加配置的rcu。正如aws文档和一些堆栈溢出答案所指出的那样(特别是关于provisionedthroughputeexcedexception):
用于amazon dynamodb的aws sdks会自动重试接收此异常的请求。因此,您的请求最终会成功,除非请求太大或重试队列太大而无法完成。
我读过类似的问题(this one,this one和this one),但我仍然感到困惑:如果请求太大或重试队列太大而无法完成(因此在自动重试之后)或实际上在重试之前,是否引发了此异常?
最重要的是:在我的上下文中,这是我应该期待的例外吗?(所以我可以抓住它并重试,直到自动缩放增加RCU?)
最佳答案
对。
每次应用程序发送超出容量的请求时,都会通过dynamo的putexdexception消息获得provisionedthroughputexdexception消息。但是,您的sdk会为您处理此问题并重试。默认dynamo重试时间从50ms开始,默认重试次数为10次,默认情况下退避是指数级的。
这意味着您可以在以下位置重试:
50毫秒
100毫秒
200毫秒
400毫秒
800毫秒
1.6秒
3.2秒
6.4秒
12.8秒
25.6秒
如果在第10次重试之后,您的请求仍然没有成功,那么sdk会将provisionedthroughputedexedexception传递回您的应用程序,并且您可以根据自己的喜好处理它。
您可以通过增加吞吐量来处理它,但另一个选项是在创建dynamo连接时更改默认的重试时间。例如
new AWS.DynamoDB({maxRetries: 13, retryDelayOptions: {base: 200}});
这意味着您要重试13次,初始延迟为200毫秒。这将使您的请求总共需要819.2秒才能完成,而不是25.6秒。