我正在尝试使用aws lambda从Kinesis获取记录,然后通过http请求将其发送到Web服务。
但有时由于网络问题,http请求失败,我想要所有数据。所以我必须重复lambda的过程。
任何人都知道怎么做?
答案 0 :(得分:2)
假设您使用Kinesis流作为事件源,除非lambda函数成功执行,否则流不会向前移动,这意味着只要您在回调中提供错误,就不必担心丢失数据。
作为参考,失败的错误将如下所示:
exports.handler = function(event, context, callback){
/* Some logic */
someRequest(someData, function(err, data){
if(err)
return callback(err);
/* More logic */
callback();
}
答案 1 :(得分:0)
如果你想从kinesis中解析解决方案,你可以使用以下结构,假设cb(err, data)
是你的回调签名:
var MY_RETRY_WAIT_TIME_IN_MILLISECONDS = 2000; // wait 2 seconds between retries
var MY_MAX_TRIES = 10; // don't try more than 10 times
function invoke(params, cb) { // this will recurse using setTimeout()
console_err('invoking lamda');
if(!params.trycount) // this is going to be incremented with each try
params.trycount = 1;
var lambda_params = {
FunctionName: 'mylambdafunction',
InvocationType: 'RequestResponse',
LogType: 'Tail',
Payload: JSON.stringify(params)
};
lambda.invoke(lambda_params, function(err, obj){
if(err) {
console_err('got an error: ' + err.toString());
if(err.toString().match(/ServiceException/)) { // make whatever conditions you want here
if(params.trycount < MY_MAX_TRIES) {
params.trycount++;
console_err('Try ' + params.trycount +
' in ' + MY_RETRY_WAIT_TIME_IN_MILLISECONDS/1000 +
' seconds');
setTimeout(function() { // try again
invoke(params, cb);
}, MY_RETRY_WAIT_TIME_IN_MILLISECONDS);
} else
cb('trycount exceeded maximum');
} else
cb(err); // handle error that you don't want to retry on
} else {
console.log("Lambda call succeeded");
cb(null, obj.Payload); // handle successful call
}
});
}