0

ich eine AWS Lambda-Funktion habe, die Push auf ein einzelnes Gerät wie dies sendet:Ausführen eine große Anzahl von gleichzeitigen Funktionen auf AWS Lambda (zum Beispiel Broadcast-Push-Benachrichtigungen)

var push = function(payload, ctx){ 
    var apn = require('apn'); 
    var connection = new apn.Connection(options); 
    var token = "(MY TOKEN HERE)"; 
    var device = new apn.Device(token); 

    var note = new apn.Notification(); 
    note.expiry = Math.floor(Date.now()/1000) + 3600; 
    note.badge = 3; 
    note.sound = "ding.wav"; 
    note.alert = "Hello"; 
    note.payload = payload; 
    connection.on('transmitted', function(){ 
    ctx.succeed({ "response": "OK" }) 
    }); 
    connection.pushNotification(note, device); 
} 

Jetzt mag ich es so erweitern Ich kann Broadcast Pushs an eine Gruppe von Geräten senden.

Zuerst dachte ich, es wäre einfach, sie alle in eine for-Schleife zu setzen, aber auf den zweiten Gedanken würde es nicht funktionieren, weil der ctx.succeed Teil nicht zurückkehren sollte, bis alle Push gesendet wurde. Auch wenn ich warte, bis alle Pushs gesendet wurden, würde die Anfrage zu lange dauern und könnte sogar eine Zeitüberschreitung verursachen.

Was ist der richtige Weg, um eine große Anzahl gleichzeitiger Anfragen wie diese auszuführen?

+0

Wie viele gleichzeitige Anfragen sprechen wir? Sie können sie entweder asynchron innerhalb einer einzigen Lambda-Ausführung ausführen oder jede als separate Lambda-Ausführung oder eine Kombination beider Ansätze ausführen. –

+0

Wie wäre es mit einer Million? Wie funktioniert die asynchrone Lambda-Ausführung? Genauer gesagt, wie geht man bei der asynchronen Ausführung einer Funktion vor, ohne dass Lambda den Fehler "Prozess beendet vor Abschluss der Anfrage" ausgelöst hat? – Vlad

Antwort

0

Sie müssen in die Async library for NodeJS suchen. Dies ist in NodeJS üblich, nicht nur in AWS Lambda-Funktionen. In Lambda würden Sie damit viele asynchrone Tasks ausführen und darauf warten, dass Sie ctx.succeed() anrufen, bis alle Async-Aufrufe abgeschlossen sind.

Für eine Million Anrufe müssen Sie noch diese aufteilen. Ich denke, Sie sollten alle diese Aufgaben als Elemente in einem Kinesis stream hinzufügen, die dann Stapel dieser Aufgaben an Ihre Lambda-Funktion senden könnte. Es könnte so konfiguriert werden, dass viele gleichzeitige Instanzen Ihrer Lambda-Funktion hochgefahren werden, die jeweils einen Batch verarbeiten.