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)
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服务: -
配置: -
var dynamodb = new AWS.DynamoDB({maxRetries: 5, retryDelayOptions: {base: 300} });
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2285 次 |
| 最近记录: |