Muster: PipesAndFiltersArchitecture



Pipes und Filter ist ein Muster zum schrittweisen Verarbeiten (z. B. Berechnen, Transformieren, ...) von Daten.

Zweck und Funktionsweise Bearbeiten

In der Informatik gibt es verschiedene Szenarien, bei denen Daten verarbeitet werden müssen – zum Beispiel um Daten aus verschiedenen Quellen in das Format des zu entwickelnden Systems zu transformieren:

  • Verarbeiten von Usereingaben
  • Verarbeiten von Eingaben durch maschinelle Schnittstellen
  • Datenimport von externen Systemen

Aber auch „ausgehende“ Daten können eine Berechnung oder Transformation benötigen:

  • Datenexport in eine Datei
  • Anbieten einer API zur Verfügungstellung von Daten

Das Pipes-And-Filtern Pattern hat sich als nützliches Strukturmuster zum Aufbau solcher Transformationslogiken erwiesen.

Aufbau Bearbeiten

Das Muster besteht aus zwei zentralen Komponenten:

  • Filter sind jene Elemente, die die eigentliche Datentransformation vornehmen. Das kann z. B. eine einfache Berechnung, eine Formatänderung (zB eines Datum-Feldes) oder eine komplette Umstrukturierung eines Datensatzes sein. Müssen die Daten mehrfach transformiert werden, so können mehrere einfache Filter hintereinandergeschalten sein.
  • Pipes sind die Verbindungselemente, die 2 Filter miteinander verknüpfen.

Varianten und Einsatzgebiete Bearbeiten

  • Einfache Pipes-And-Filters: Ein Datensatz im Eingangsformat wird in die Eingangspipe des ersten Filters gestellt. Der Filter bearbeitet den Datensatz und stellt den transformierten Datensatz in seine Ausgangspipe. Diese kann wieder als Eingang für den nächsten Filter verwendet werden usw., bis der letzte Filter durchlaufen ist und sich der Datensatz im gewünschten Endformat befindet.
  • Mehrfache Pipes-And-Filters: z. B. kann aus verschiedenen Datenquellen gelesen werden und die Daten durch entsprechende Filter auf das interne Format des Zielsystems gebracht werden. Diese verschiedenen Filterkaskaden können parallel ausgeführt werden. Die Implementierung einzelner Filter (zB in Form von Klassen) kann in mehreren Filterkaskadenverwendet werden (Stichwort Wiederverwendbarkeit)
  • Parallelisierung von Pipes-And-Filters: Dieses Architekturmuster bietet sich zur Parallelisierung an, da die einzelnen Filterschritte voneinander unabhängig sind. Oft passiert es, dass in einer Kaskade von mehreren Filtern einer besonders langsam ist (weil er kompliziertere Berechnungen durchführt als die anderen). Dieser Filter kann parallel ausgeführt werden, wobei sich jede Filterinstanz einen Datensatz aus der Eingangspipe holt und den transformierten Datensatz in die Ausgabepipe stellt. Zu beachten ist hierbei, dass sich die Reihenfolge der Datensätze somit ändern kann, weil die Ausführungszeit einer Filterinstanz für die Berechnung eines Datensatzes nicht deterministisch ist.

Vorteile Bearbeiten

Es ergeben sich einige Vorteile im Gegensatz zu einer monolithischen Lösung:

  • Einzelne Filter sind in verschiedenen Kaskaden wiederverwendbar
  • Einzelne Filter sind leicht austauschbar oder adaptierbar
  • Pipes-And-Filter-Architekturen sind gut parallelisierbar

Nachteile Bearbeiten

  • Evtl. mehr Implementierungsaufwand durch granulare Filter
  • Evtl. Performanceverlust durch zu granulare Filter
  • Aufwändigeres Sicherstellen von transaktionalem Verhalten (z. B. was passiert, wenn die Bearbeitung eines Datensatzes fehlschlägt? ...)

Praxisbeispiele Bearbeiten

Pipes und Filter kommen überall da zum Einsatz, wo Daten schrittweise manipuliert werden müssen.

  • Übersetzer (Compiler) und Interpreter arbeiten mit Pipes und Filter um den Quellcode in ausführbare Maschinensprache zu übersetzen. Die einzelnen Filter können (in dieser Reiheinfolge) etwa so aussehen:
    • Lexikalische Analyse
    • Syntaxanalyse
    • Semantische Analyse
    • Optimierung
    • Codegenerierung
  • Datenkompression
  • Encoding von Video- oder Audiodateien (MPEG, MP3, ...)

Abgrenzungen Bearbeiten