NodeJS中BatchWrite到DynamoDB时的指数退避

der*_*dji 7 amazon-web-services node.js amazon-dynamodb aws-lambda

我有从S3读取CSV文件的工作代码,在BatchWriteItemDynamoDB请求中每25行分组,然后发送它.该BatchWrite会经常回成功与UnprocessedItems其中含有部分项目(不是所有的25).随后的重新提交也可能失败(部分或完全).我想在发送后续请求时实现指数退避,但我发现假设任务相同的所有库.就我而言,这些项目可能与先前请求中的项目相同或不同.

我对Node.js不太熟悉.是否有任何库/方法来实现具有(不同)上下文的重新尝试的任务?

我正在使用AWS Lambda,因此无法使用全局变量.

辅助函数写入DDB,重试1次:

// batchwrite to DDB
function batchWriteDDB(params) {
  dynamodb.batchWriteItem(params, function(err, data) {
    if (err) {
      console.error("Batchwrite failed: " + err, err.stack);
    } else {
      var unprocessed = data.UnprocessedItems;
      if (Object.keys(unprocessed).length === 0) {
        console.log("Processed all items.");
      } else {
        // some unprocessed items, do it again
        console.warn("Batchwrite did not to complete: " + util.inspect(unprocessed, { showHidden: false, depth: null }));
        console.log("Retry btachwriting...");
        var params2 = {};
        params2["RequestItems"] = data.UnprocessedItems;
        dynamodb.batchWriteItem(params2, function(error, data2) {
          if (err) {
            console.error("Retry failed: " + err, err.stack);
          } else {
            var unprocessed2 = data2.UnprocessedItems;
            if (Object.keys(unprocessed2).length === 0) {
              console.log("Retry processed all items.");
            } else {
              console.error("Failed AGAIN to complete: " + util.inspect(unprocessed2, { showHidden: false, depth: null }));
            }
          }
        });
      }
    }
  });
}
Run Code Online (Sandbox Code Playgroud)

not*_*est 9

AWS开发工具包支持指数退避和重试机制.你可以配置它.

将所有服务的基本重试延迟设置为300毫秒

AWS.config.update({retryDelayOptions: {base: 300}});
// Delays with maxRetries = 3: 300, 600, 1200
Run Code Online (Sandbox Code Playgroud)

设置自定义退避功能以在重试时提供延迟值

AWS.config.update({retryDelayOptions: {customBackoff: function(retryCount) {
  // returns delay in ms
}}});
Run Code Online (Sandbox Code Playgroud)

具体配置AWS DynamoDB服务: -

var dynamodb = (new AWS.DynamoDB({maxRetries: 5}))
Run Code Online (Sandbox Code Playgroud)

具体配置AWS DynamoDB服务: -

  • maxRetries = 5
  • 延迟= 300ms

配置: -

var dynamodb = new AWS.DynamoDB({maxRetries: 5, retryDelayOptions: {base: 300} });
Run Code Online (Sandbox Code Playgroud)

MaxRetry属性

  • 请求从未失败,他们总是通过一些“未处理的项目”。我在这里重试的不是整个任务,而是未处理的任务。 (3认同)