2017-10-12 3 views
0

Ich bin mit aws-sdk für die Veröffentlichung Nachricht zum Thema unter Verwendung der Code:Verzögerung in zum Thema veröffentlicht Nachricht aws-sdk iotData.publish auf aws Lambda

var AWS = require('aws-sdk'); 
AWS.config.region = 'us-east-1'; 
AWS.config.credentials = { 
    accessKeyId: 'myaccesskeyid', 
    secretAccessKey: 'mysecretaccesskey' 
} 

function LEDOnIntent() { 
    this.iotdata = new AWS.IotData({ 
     endpoint: 'XXXXXXXXX.iot.us-east-1.amazonaws.com' 
    }); 
} 

LEDOnIntent.prototype.publishMessage = function() { 
    console.log('>publishMessage'); 
    var params = { 
     topic: 'test_topic', 
     /* required */ 
     payload: new Buffer('{action : "LED on"}') || 'STRING_VALUE', 
     qos: 1 
    }; 
    this.iotdata.publish(params, function(err, data) { 
     if (err) console.log(err, err.stack); // an error occurred 
     else { 
      console.log("Message published : " + data); // successful response 
     } 
    }); 
} 

Es funktioniert in lokalen Unit-Tests gut, aber Wenn ich diesen Code auf AWS Lambda deployt, dann habe ich sehr ungleiches Verhalten. Für die ersten paar Anfragen wird es keine Nachricht veröffentlichen, dann wird es gut funktionieren, wenn ich es kontinuierlich teste. Wenn ich nach etwas Pause teste, dann hört es wieder auf für erste Anfragen zu arbeiten.

+0

hat überprüfen Lambda-Protokolle in Cloudwatch zu der Zeit es nicht funktioniert? –

+0

Ja. Es rief Lambda auf, verzögerte jedoch die Veröffentlichung der Nachricht. Also, wenn ich Anfrage trete, sehe ich "> publishMessage" im Protokoll aber nicht "Nachricht veröffentlicht: ..." – Nidhish

+0

Es gibt einen Grund für die Verzögerung, wenn Sie nach einer Pause laufen, die ich in der Antwort hinzugefügt habe. Es würde sich lohnen zu prüfen, wie lange es dauert, bis das Lambda-Setup eingerichtet ist. Was Sie tun können, ist die erste Veröffentlichung zu tun, lassen Sie einige Sekunden und versuchen Sie anschließende Anfrage. Nur um zu identifizieren, wie lange die Verzögerung sein würde –

Antwort

0

Hinter der Szene läuft Lambda wie ein Containermodell. Es bedeutet, einen Container bei Bedarf zu erstellen und ihn zu zerstören, wenn der Container nicht benötigt wird.

Der Grund, warum Sie eine Verzögerung in der ersten Anfrage sehen, weil es Zeit braucht, um einen Container einzurichten und das erforderliche Bootstrapping durchzuführen, das jedes Mal, wenn die Lambda-Funktion aufgerufen wird, etwas Latenz hinzufügt. Diese Latenz wird normalerweise angezeigt, wenn eine Lambda-Funktion zum ersten Mal oder nach ihrer Aktualisierung aufgerufen wird, da AWS Lambda versucht, den Container für nachfolgende Aufrufe der Lambda-Funktion wiederzuverwenden.

AWS Lambda behält den Container für einige Zeit in Erwartung eines weiteren Aufrufs der Lambda-Funktion bei. In der Tat friert der Dienst den Container ein, nachdem eine Lambda-Funktion abgeschlossen ist, und taut den Container zur Wiederverwendung auf, wenn AWS Lambda den Container erneut verwendet, wenn die Lambda-Funktion erneut aufgerufen wird.

Bitte lesen Sie die offizielle Dokumentation here