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

Man*_*uel 2 javascript amazon-web-services node.js amazon-dynamodb

我有很高的流量峰值,因此我想覆盖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';
Run Code Online (Sandbox Code Playgroud)

我发现了以下亚马逊变量和代码片段,但是我不知道如何用配置连接它?

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;
}
Run Code Online (Sandbox Code Playgroud)

Far*_*ina 8

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

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

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

aws.config.maxRetries = 20;
Run Code Online (Sandbox Code Playgroud)

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;

});
Run Code Online (Sandbox Code Playgroud)

请注意,存在一个内部运行的指数退避策略,因此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;
}
Run Code Online (Sandbox Code Playgroud)

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

aws.Service.prototype.retryDelays = function(){ // Do some }
Run Code Online (Sandbox Code Playgroud)

但是,这会影响所有服务,在深入研究这些内容之后,显然他们的API不是通过配置以优雅的方式覆盖您的用例.


blo*_*p3r 5

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

这一页指出:

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

因此,如果要定义一个customBackoff函数,即:确定 a retryDelay,通过配置是不可能的。我发现的唯一方法是覆盖私有方法retryDelaysDynamoDB 对象的私有方法 ( aws-sdk-js/lib/services/dynamodb.js)。

下面是一个执行此操作的示例,其中实现了带抖动的指数退避:

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;
};
Run Code Online (Sandbox Code Playgroud)

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

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

也可以看看 :

  • 它已被修复,现在可以使用 `customBackoff` :) (3认同)