如何在 Node js API 中配置 DynamoDB retryLimit 和 retryDelay?

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

我的流量高峰很高,因此我想覆盖 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';

我找到了以下亚马逊变量和代码片段,但是我不确定如何将其与配置相关联?

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 private API 在内部使用 maxRetries 配置设置,因此像我上面的代码一样全局设置该参数应该有效。 retryLimit完全没用,算了。

重试次数可以通过配置来设置,但是好像没有优雅的方式来设置重试delay/backoff策略等

操纵这些的唯一方法是监听 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 不是个好主意,但您可以通过修改服务的原型来做到这一点 class:

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

然而,这会影响所有服务,在深入研究这些东西之后,很明显它们 API 并不是为了通过配置以优雅的方式涵盖您的用例而构建的。

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

This page 指出:

Note: This works with all services except 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
});

另请参阅: