2017-10-05 2 views
4

Wir versuchen das Lambda für unseren ETL-Job, der in Clojure geschrieben wird.Handle Kind Lambda Fehler

Unsere Architektur ist der Scheduler löst das Eltern-Lambda, dann der Eltern-Lambda-Trigger 100 Kind Lambda und Zähler Lambda. Das Kind Lambdas nach Abschluss ihrer Arbeit wird es die Daten zu s3 schreiben. Das Zähler-Lambda überprüft die Anzahl der Dateien in S3, wenn es 100 ist, dann kombiniert es alle Dateien und speichert es in S3, andernfalls wird es ein neues Zähler-Lambda überspannen und sterben.

Das ganze positive Szenario funktioniert gut, aber wenn ein Kind scheitert, dann wird das Zähler-Lambda in der unbestimmten Schleife enden, weil es nicht 100 Dateien gibt.

Wenn es eine angemessene Möglichkeit gibt, Kind Lambda zu überspannen, überwachen Sie es und wenn es fehlschlägt, müssen Sie neu starten oder wiederholen Sie das allein?

Gibt es ein gutes Clojure Lambda-Framework?

+0

Haben Sie die AWS-Schrittfunktionen zur Koordinierung Ihrer Lambdas verwendet? https://aws.amazon.com/step-functions/ –

+0

Ihr System hört sich besser an als meine, jede Chance, die Framework-Teile zu öffnen? –

+0

@MarkB Das haben wir auch gefunden. Danke für den Kommentar. – SANN3

Antwort

1

Es gibt einen einfachen Ausweg in AWS heißt AWS Step Functions. Step-Funktionen bietet eine grafische Konsole, um die Komponenten Ihrer Anwendung als eine Reihe von Schritten anzuordnen und zu visualisieren. Definieren Sie Schritte mithilfe der AWS Step Functions-Konsole oder API, einer fließenden Java-API oder AWS CloudFormation-Vorlagen.

Schritt macht es einfach, AWS Lambda-Funktionen zu orchestrieren. Unabhängig von der Funktionssprache verwaltet es alle Lambdas.

Schritt ist die Verwendung Fällen gut funktioniert

  1. Run-Sequenz für folgende
  2. Run Funktionen parallel
  3. Select Funktionen basieren auf Daten
  4. Wiederholen Sie die Funktionen
  5. try/catch/finally für Funktionen
  6. Ausführen des Codes für Stunden
2

Die Prozessüberwachung ist in keine Lambda-Clojure-Bibliotheken integriert, die ich kenne. Für diesen Fall würde ich empfehlen, eine Seite aus dem Erlang-Buch zu nehmen (supervisor trees) und ein verteiltes System zu haben jeder Schauspieler braucht einen Monitor, also wäre ein anständiger Ansatz, einen Beobachter für jede Lambda-Aufgabe zu haben. Dies kann die Fehlerbehandlungsfälle entlang der "Let it Crash" -Philosophie wirklich vereinfachen.

So würde das lassen Sie mit dieser Liste der Lambda-Ausdrücke:

  • Zähler:
    • ein Beobachter/restarter für den Zähler (Sie Art bereits diese haben)
  • Arbeiter x100
  • Aufsichtsbehörden x100

Jeder Supervisor prüft nur das Vorhandensein einer bestimmten Datei und startet ein bestimmtes Lambda neu, falls es nicht existiert. Das wird viel einfacher, wenn Ihr Prozess idempotent ist, so dass Sie sich keine Sorgen machen müssen, wenn eine Datei doppelt erstellt wird. Es ist jedoch nicht schwer zu überprüfen, ob das Lambda, das ein Supervisor überwacht, noch mit der aws API läuft. Dieser Supervisor kann von dem, was er überwacht, oder von dem, der den Rest des Systems startet, gestartet werden, was auch immer einfacher für Ihre Codebasis ist. Sie müssen die Worker wahrscheinlich nicht explizit starten, der Supervisor kann das tun.

Der wichtige Teil ist, Cloudwatch oder was auch immer Ihre Lieblings-Eventing-System ist hinzuzufügen (meine ist Riemann), so können Sie Warnungen hinzufügen, um zu wissen, wenn Sie die Beobachter beobachten müssen.