2015-10-20 13 views
10

In meinem Szenario versuche ich Server-less Backend zu implementieren, das ziemlich lange zeitraubende Berechnungen ausführt. Diese Berechnungen werden von Lambda verwaltet, das sich auf eine externe API bezieht.Informieren Sie Browser-Clients, wenn die Lambda-Funktion mit Amazon SQS ausgeführt wird

Um dies zu beantragen, benutze ich Amazon API Gateway mit 10 Sekunden Ausführungsbeschränkung. Lambda läuft jedoch etwa 100 Sekunden.

Um diese Einschränkung zu vermeiden, verwende ich die 2. Lambda-Funktion, um diese zeitaufwendige Berechnung auszuführen & Bericht, dass die Berechnung gestartet wird.

I sieht sehr ähnlich wie diese:

var AWS = require('aws-sdk'); 
var colors = require('colors'); 

var functionName = 'really-long' 

var lambda = new AWS.Lambda({apiVersion: '2015-03-31'}); 

var params = { 
    FunctionName: functionName, 
    InvocationType: 'Event' 
}; 


lambda.invoke(params, function(err, data) { 
    if (err) console.log(err, err.stack); // an error occurred 
    else  console.log(functionName.green + " was successfully executed and returned:\n" + JSON.stringify(data, null, 2).gray);   // successful response 
}); 

console.log("All done!".rainbow); 

Dieser Code über AWS API-Gateway von Tausenden von Kunden-Browser unabhängig ausgeführt wird.

Um jeden einzelnen Kunden darüber zu informieren, dass seine Ausführung der Lambda-Funktion erfolgreich war, habe ich die Verwendung von AWS SQS geplant (wegen der langen Abfrage und einigen anderen nützlichen Funktionen).

Also meine Frage ist: die Nachricht in der Warteschlange gehört zu diesem bestimmten Client

Wie kann ich auf dem Client bestimmen? Oder sollte ich über alle Warteschlangen iterieren, um in jedem Client-Browser über einen Parameter der Anfrage-ID die richtigen Nachrichten zu finden? Ich denke, dass diese Methode ineffizient sein wird, wenn 1000 Clients gleichzeitig auf ihre Ergebnisse warten werden.

Ich verstehe, dass ich Ergebnisse in DynamoDB zum Beispiel schreiben kann und regelmäßig DB für das Ergebnis über einige hausgemachte API abfragen. Aber gibt es irgendeine elegante Lösung, browserbasierten Client über den Abschluss der Ausführung von zeitraubenden Lambda-Funktion basierend auf einigen Amazon PaaS-Lösung zu benachrichtigen?

Antwort

3

Ehrlich gesagt ist die DynamoDB Route wahrscheinlich die beste Wahl. Sie können eine UUID in der ersten Lambda-Funktion generieren, die vom API-Gateway ausgeführt wird. Übergeben Sie diese UUID an die lang laufende Lambda-Funktion. Bevor die zweite Funktion abgeschlossen ist, muss sie in eine DynamoDB-Tabelle mit zwei Spalten geschrieben werden: uuid und result.

Das API-Gateway antwortet dem Client mit der von ihm generierten UUID. Der Client fragt dann lange nach einer getItem Anfrage für Ihre DynamoDB-Tabelle ab (entweder über die aws-sdk direkt oder über eine andere API-Gateway-Anfrage). Sobald es erfolgreich antwortet, entfernen Sie das Element aus der DynamoDB-Tabelle.

1

Im Kontextobjekt der Lambda-Funktion wird die AWS-Anforderungs-ID an den Client zurückgegeben, der die Lambda-Funktion aufgerufen hat.

Also Client wird die Lambda-Anfrage-ID von Lambda 1, Lambda 1 Kontext Objekt wird die gleiche Anfrage-ID haben (unabhängig von Lambda Versuche, Anfrage ID bleibt gleich). Übergeben Sie diese Anfrage-ID also an Lambda 2, da die tatsächliche Anfrage-ID bis zum Ende gekettet ist.

Abruf mit der Anfrage-ID vom Client ist ziemlich einfach auf jedem Datenspeicher wie Dynamodb.