Globale Fehlerbehandlung pro Block in einer Dataflow-Pipeline

8

Ich entwerfe eine lang laufende Dataflow-Pipeline, die aus mehreren Blöcken besteht. Elemente werden dem Eingabeblock der Pipeline zugeführt, gehen schließlich durch sie hindurch und werden am Ende in der Benutzeroberfläche angezeigt (aus Rücksicht auf den Benutzer - die eigentliche Aufgabe der Pipeline besteht darin, die Verarbeitungsergebnisse auf der Festplatte zu speichern) / p>

Die Lambda-Funktionen innerhalb der Pipeline-Blöcke können aus verschiedenen Gründen (schlechte Eingabe, Netzwerkfehler, Fehler während der Berechnung, was auch immer) Ausnahmen auslösen. In diesem Fall würde ich, anstatt die gesamte Pipeline zu beschädigen, den störenden Artikel rausschmeißen und ihn in der Benutzeroberfläche unter "Fehler" anzeigen.

Was ist der beste Weg, das zu tun? Ich verstehe, dass ich jede einzelne Lambda-Funktion in einen try / catch einpacken kann:

%Vor%

Aber ich habe ungefähr 10 Blöcke in der Pipeline, und das Kopieren / Einfügen dieses Codes in jeden scheint albern zu sein. Außerdem mag ich nicht die Idee, Null zurückzugeben, da jetzt alle nachgelagerten Blöcke darauf achten müssen.

Meine nächste beste Idee ist es, eine Funktion zu erstellen, die ein Lambda zurückgibt, das das Wrapping für mich erledigt:

%Vor%

Aber das scheint ein bisschen zu meta. Gibt es einen besseren Weg?

    
Bugmaster 12.08.2015, 05:13
quelle

1 Antwort

4

Das ist ein sehr interessantes Thema.

Sie können Filter definieren, wenn Sie Blöcke verknüpfen, was bedeutet, dass Sie Fehlerergebnisse in Fehlerbehandlungsblöcke umleiten können. Um dies zu tun, sollten Blöcke "Meta" -Objekte zurückgeben, die sowohl ihre Verarbeitungsergebnisse als auch mindestens einen Fehler / Erfolg-Indikator enthalten.

Diese Idee wird in eisenbahnorientierte Programmierung besser beschrieben, wo jede Funktion in einer Kette erfolgreiche Ergebnisse oder Umleitungen verarbeitet führt zu einer "fehlgeschlagenen Spur" für die eventuelle Protokollierung.

Praktisch bedeutet dies, dass Sie nach jedem Block zwei Verknüpfungen hinzufügen sollten: eine mit einer Filterbedingung, die zu einem Fehlerbehandlungsblock umgeleitet wird, und eine Standardverbindung, die zum nächsten Schritt im Ablauf übergeht.

Sie könnten die beiden Ideen sogar kombinieren, um partielle Fehler zu behandeln. Ein Teilfehlerergebnis würde sowohl einen Fehlerindikator als auch eine Nutzlast enthalten. Sie können das Ergebnis in einen Protokollblock umleiten, bevor Sie es zum nächsten Schritt weiterleiten.

Ich habe festgestellt, dass viel einfacher ist, den Status jeder Nachricht explizit zu beschreiben, anstatt zu versuchen, seinen Status zu ermitteln, indem er nach Null, fehlenden Werten usw. sucht. Dies bedeutet, dass Blöcke ihre Ergebnisse umbrechen sollten in "envelope" -Objekten, die Statusflags, die Ergebnisse und / oder Fehler enthalten.

    
Panagiotis Kanavos 12.08.2015 15:52
quelle

Tags und Links