2016-06-23 5 views
0

Ich versuche, AWS Lambda zu verwenden, um Datensätze von Kinesis zu erhalten und sie dann per HTTP-Anforderung an einen Webdienst zu senden.Wie wiederhole ich den Prozess, wenn das Lambda nicht funktioniert?

Aber manchmal ist die HTTP-Anfrage wegen des Netzwerkproblems fehlgeschlagen, ich möchte alle Daten. Also muss ich den Prozess des Lambda wiederholen.

Wer weiß, wie es geht?

Antwort

2

Angenommen, Sie verwenden den Kinesis-Stream als Ereignisquelle, wird der Stream nur dann vorwärts verschoben, wenn die Lambda-Funktion erfolgreich ausgeführt wird. Solange Sie einen Fehler im Callback angeben, müssen Sie sich keine Gedanken über fehlende Daten machen .
Als Referenz auf Fehler andernfalls würde wie folgt aussehen:

exports.handler = function(event, context, callback){ 
    /* Some logic */ 
    someRequest(someData, function(err, data){ 
    if(err) 
     return callback(err); 
    /* More logic */ 
    callback(); 
} 
0

Wenn Sie die Lösung von Kinesis entkoppeln wollen, können Sie das folgende Konstrukt verwenden können, cb(err, data) unter der Annahme Ihrer Callback-Signatur:

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