当lambda失败时如何重复这个过程?

时间:2016-06-23 02:12:40

标签: aws-lambda

我正在尝试使用aws lambda从Kinesis获取记录,然后通过http请求将其发送到Web服务。

但有时由于网络问题,http请求失败,我想要所有数据。所以我必须重复lambda的过程。

任何人都知道怎么做?

2 个答案:

答案 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
    }
  });
}