如何在Nodejs API中配置DynamoDB retryLimit和retryDelay

How to configure DynamoDB retryLimit and retryDelay in Node js API?

本文关键字:DynamoDB retryLimit retryDelay 配置 Nodejs API      更新时间:2024-05-21

我有相当高的流量峰值,因此我想覆盖dynamodb重试限制和重试策略。

不知怎么的,我找不到合适的配置属性来覆盖重试限制和函数。

到目前为止我的代码

var aws = require( 'aws-sdk');
var table = new aws.DynamoDB({params: {TableName: 'MyTable'}});
aws.config.update({accessKeyId: process.env.AWS_ACCESS_KEY_ID, secretAccessKey: process.env.AWS_SECRET_KEY});
aws.config.region = 'eu-central-1';

我发现了以下amazon变量和代码片段,但我不确定如何将其与配置联系起来?

retryLimit: 15,
retryDelays: function retryDelays() {
    var retryCount = this.numRetries();
    var delays = [];
    for (var i = 0; i < retryCount; ++i) {
        if (i === 0) {
            delays.push(0);
        } else {
            delays.push(60*1000 *i); // Retry every minute instead
            // Amazon Defaultdelays.push(50 * Math.pow(2, i - 1));
        }
    }
    return delays;
}

配置非常有限,您可以在其上设置的唯一重试参数是maxRetries

maxRetries (Integer) — the maximum amount of retries to attempt with a request. See AWS.DynamoDB.maxRetries for more information.

您应该将maxRetries设置为适合您的用例的值。

aws.config.maxRetries = 20;

retryDelays私有API在内部使用maxRetries配置设置,因此像上面的代码中那样全局设置该参数应该有效。retryLimit是完全无用的,忘记它吧

重试次数可以通过配置进行设置,但似乎没有一种优雅的方法来设置重试延迟/回退策略等。

操作这些的唯一方法是侦听retry事件,并在事件处理程序回调中操作重试延迟(和相关行为):

aws.events.on('retry', function(resp) {
    // Enable or disable retries completely.
    // disabling is equivalent to setting maxRetries to 0.
    if (resp.error) resp.error.retryable = true;
    // retry all requests with a 2sec delay (if they are retryable)
    if (resp.error) resp.error.retryDelay = 2000;
});

请注意,有一种指数退避策略在内部运行,因此后续重试的retryDelay实际上不是2s。如果您查看内部service.js文件,您将看到该函数的外观:

retryDelays: function retryDelays() {
  var retryCount = this.numRetries();
  var delays = [];
  for (var i = 0; i < retryCount; ++i) {
    delays[i] = Math.pow(2, i) * 30;
  }
  return delays;
}

我认为修改内部API不是一个好主意,但你可以通过修改服务类的原型:来实现

aws.Service.prototype.retryDelays = function(){ // Do some }

然而,这将影响所有服务,在深入研究这些内容后,很明显,他们的API并不是为了通过配置以优雅的方式覆盖你的用例而构建的。

javascript AWS SDK不允许DynamoDB服务覆盖retryDelayOptions,因此不允许定义customBackoff。这些配置对于其余的服务是允许的,但由于某些原因,对DynamoDB不起作用。

本页注意到:

注意:这适用于除DynamoDB之外的所有服务。

因此,如果要定义customBackoff函数,即:确定retryDelay,则无法通过配置实现。我找到的唯一方法是覆盖DynamoDB对象(aws-sdk-js/lib/services/dynamodb.js)的私有方法retryDelays

这里有一个例子,其中实现了具有抖动的指数后退:

AWS.DynamoDB.prototype.retryDelays = (retryCount: number): number => {
    
    let temp = Math.min(cap, base * Math.pow(2, retryCount));
    let sleep = Math.random() * temp + 1;
    return sleep;
};

可以通过DynamoDB配置对象的maxRetries属性设置最大重试次数或重试限制,例如:

let dynamodb = new AWS.DynamoDB({
    region: 'us-east-1',
    maxRetries: 30
});

另请参阅:

  • https://github.com/aws/aws-sdk-js/issues/402
  • https://github.com/aws/aws-sdk-js/issues/1171
  • https://github.com/aws/aws-sdk-js/issues/1100
  • http://docs.aws.amazon.com/amazondynamodb/latest/developerguide/Programming.Errors.html#Programming.Errors.RetryAndBackoff
  • https://www.awsarchitectureblog.com/2015/03/backoff.html