2016-06-13 13 views
9

Ich verwende zwei Lambda-Funktionen mit Javascript 4.3 Laufzeit. Ich führe die erste und es ruft die zweite synchron (Sync ist die Absicht). Das Problem ist das zweite mal (bei 60 Sekunden), aber es erreicht tatsächlich ein erfolgreiches Ende nach nur 22 Sekunden.Lambda Zeitüberschreitung nach Callback

Hier ist der Fluss zwischen den zwei Lambda-Funktionen:

flow

Lamda Funktion A Ich bin nicht mehr für Cloudwatch-Protokolle erhalten, aber das eigentliche Problem (glaube ich) ist Funktion B, die mal ohne Grund.

Hier einige Cloudwatch-Protokolle dies zu verdeutlichen:

cloudwatch logs

Der Code in Funktion B am Ende - das ist die "Success" Log-Anweisung im Bild sehen enthält oben - unten enthalten ist:

code example

Ursprünglich hatte ich nur die callback(null, 'successful ...') Linie und nicht die NodeJS 0.10.x Art und Weise, wo Sie succeed() abgeblasen o f Kontext. In meiner Verzweiflung habe ich beides hinzugefügt, aber das Ergebnis ist dasselbe.

Wer hat eine Idee, was los ist? Irgendwie kann ich das debuggen?


Falls die Aufruflogik zwischen A und B eine Differenz in dem Zustand macht, die in B beginnt, ist hier der Aufruf:

invocation of Function b

+10

Ich bekomme immer noch den Hang von Lambda + Node 4.3, selbst, aber Einstellung ['context.callbackWaitsForEmptyEventLoop = false;'] (https://aws.amazon.com/blogs/compute/ node-js-4-3-2-runtime-now-available-on-lambda /) könnte ein Workaround für das sein, was Sie sehen, wenn es ähnlich zu dem ist, in dem ich lief - ich hatte eine mysql-Verbindung, die ich nicht war Trennen, was wiederum die Ereignisschleife nicht leer hielt. Das Setzen des Wertes wie gezeigt hat das Problem bewiesen (durch "Fixieren" des Run-To-Timeouts); Angesichts dieser Beweise war ich in der Lage, es richtig zu lösen, indem ich diese Verbindung schloss. An diesem Punkt brauchte ich den Workaround nicht mehr. –

+0

Ok, ich denke, das ist ein Thread, dem ich folgen kann; hatte die funktionale Variation des 4.3 Callbacks vergessen. Vielen Dank! Hinweis: Ich habe diese Frage an AWS abgewiesen, und sie kamen, um zu sagen, dass viele Leute dieses Problem haben und dass das Problem dadurch behoben wird, dass viele zu 0.10 zurückkehren. Das hat für mich funktioniert, aber das ist natürlich keine gute Lösung, da es offene Verbindungen gibt, die ich lieber auf eine anmutige/kontrollierte Art schließen möchte. – ken

Antwort

16

Michael - sqlbot Wie gesagt; Das Problem scheint zu sein, dass das Aufrufen des Rückrufs die Funktion nicht beendet, solange eine offene Verbindung vorhanden ist, weil die Ereignisschleife nicht leer ist. Hatte das gleiche Problem mit einer offenen Redis-Verbindung; Lösung wie angegeben ist context.callbackWaitsForEmptyEventLoop = false;

+0

Das funktionierte früher, aber es funktioniert nicht mehr. Ich habe das gleiche Problem mit redis Verbindung –

+0

Ich habe nicht in der Lage, dies zur Arbeit zu bekommen. Ich habe auch einen Thread im Knoten mysql github gelesen, dass es notwendig sein könnte, diesen Wert auf wahr zu setzen, wenn Sie Timeouts bekommen. – red6

Verwandte Themen