Filecast: Vom Filesystem ins Pulsar-Topic

Filecast: Vom Filesystem ins Pulsar-Topic
By Matthias Petermann / on 11.11.2025

Vom Batch zum Event

Neulich stand ich bei einer Integrationsaufgabe wieder einmal vor einem vertrauten Muster: Ein Legacy-System erzeugte regelmäßig Datenextrakte als Dateien, die dann per FTP abgeholt wurden.

Dabei stellte sich die naheliegende Frage: Warum eigentlich warten, bis ein Cronjob sie einsammelt? Könnte man nicht in Echtzeit reagieren – genau in dem Moment, in dem die Datei geschrieben und geschlossen wird?

Aus diesem Gedanken entstand Filecast: Ein leichtgewichtiges Go-Tool, das Dateisystem-Events erkennt und jede neu geschriebene Datei automatisch in ein Apache-Pulsar-Topic streamt.


Motivation

Das Prinzip „Datei schreiben, später abholen“ ist in vielen Integrationslandschaften fest verankert – robust, aber reaktionsarm. Daten entstehen in Batches, nicht in Echtzeit. Jede Verzögerung in diesem Prozess erhöht die Latenz, bis Informationen tatsächlich nutzbar sind.

ℹ️ Batch vs. Event

Ein Batch-Prozess arbeitet in Intervallen – etwa alle 10 Minuten oder einmal pro Nacht. Ein Event-Prozess reagiert sofort, sobald etwas passiert.

Statt „hole alle neuen Dateien ab“, heißt es:

„Eine Datei wurde geschrieben – reagiere jetzt!“

Wenn ein Unternehmen bereits eine Event-Infrastruktur wie Apache Pulsar betreibt, lässt sich dieser Wechsel leicht vollziehen: Man muss die Legacy-Systeme nicht umbauen – nur das „Dateiende“ eventisieren.


Idee

Die Grundidee ist erstaunlich simpel – und gerade deshalb so charmant:

Sobald in einem überwachten Verzeichnis eine Datei vollständig geschrieben wurde, erkennt Filecast das, liest die Datei blockweise aus und überträgt sie als Chunked Stream in ein Pulsar-Topic:

persistent://<tenant>/<namespace>/files/<filename>.stream

So wird jede neu entstandene Datei zu einem Event-Strom – nachvollziehbar, geordnet und verlässlich. Das Ganze passiert sofort beim Schreiben, nicht erst in einem nächtlichen Batch.

📝 Ein Beispiel aus der Praxis

Ein Abrechnungssystem schreibt jede Stunde eine neue CSV-Datei mit Buchungen in /data/export/. Mit Filecast landet jede Datei sofort nach Fertigstellung als Stream im Topic persistent://finance/exports/files/buchungen_2025-11-11.csv.stream.

Ein Downstream-Service kann diese Daten dann direkt konsumieren, validieren oder in eine Datenbank importieren – ganz ohne FTP oder Polling.


Umsetzung

Der Proof-of-Concept filecast ist in Go entwickelt – aus guten Gründen:

  • Go-Programme starten schnell, laufen stabil und benötigen keine externe Laufzeitumgebung.
  • Durch Nebenläufigkeit und Channels eignet sich Go hervorragend für IO-intensive Prozesse wie Dateiüberwachung und Streaming.
  • Zudem lässt sich Go plattformunabhängig kompilieren – ein Binary genügt, keine Installation nötig.

Unter der Haube kombiniert filecast zwei zentrale Technologien:

1. inotify – Dateisystemereignisse unter Linux

inotify ist ein Kernel-Subsystem, das Anwendungen über Dateiänderungen informiert. Filecast nutzt es, um in Echtzeit auf neue oder geänderte Dateien zu reagieren.

Sobald im überwachten Verzeichnis eine Datei erstellt (CREATE) und später geschlossen (CLOSE_WRITE) wird, erkennt Filecast, dass der Schreibvorgang abgeschlossen ist. Erst dann liest es die Datei ein und überträgt sie an Pulsar – exakt im richtigen Moment, ohne Race Conditions oder halbfertige Daten.

📝 Wichtig zu wissen
inotify ist Linux-spezifisch. Auf anderen Betriebssystemen – etwa macOS oder Windows – existieren vergleichbare Mechanismen wie FSEvents oder ReadDirectoryChangesW. Außerdem gilt: Die Überwachung funktioniert nur zuverlässig auf lokalen Dateisystemen, nicht auf NFS- oder SMB-Mounts.

2. Apache Pulsar Go Client – Dateien als Stream publizieren

Für den Versand der Dateien nutzt Filecast den nativen Apache Pulsar Go Client. Dieser erlaubt es, Daten in sogenannten Chunked Messages zu publizieren: Die Datei wird in handliche Blöcke zerlegt, sequentiell gesendet und vom Pulsar-Broker wieder zu einem Stream zusammengesetzt.

So lassen sich auch große Dateien effizient verarbeiten, ohne sie komplett in den Speicher laden zu müssen.

🤔 Warum Chunking?
Chunking ermöglicht das Streamen großer Dateien (z. B. mehrere hundert Megabyte) ohne Memory-Overhead. Jeder Block wird als einzelne Pulsar-Nachricht gesendet. Empfänger können die Chunks wieder zusammensetzen – oder sie sogar während des Empfangs weiterverarbeiten.

Lokaler Test mit Podman

Wer das Prinzip ausprobieren möchte, kann Apache Pulsar lokal mit Podman starten – schnell, isoliert und ohne Installation:

podman run -it --rm \
  -p 6650:6650 \
  -p 8080:8080 \
  docker.io/apachepulsar/pulsar:4.0.7 \
  bin/pulsar standalone

Dieser Container startet eine vollständige Standalone-Instanz mit Broker, BookKeeper und Zookeeper. Die Ports 6650 (Client) und 8080 (Admin/API) stehen direkt bereit.


Filecast starten

Danach genügt ein einfacher Aufruf:

export PULSAR_URL=pulsar://localhost:6650

./filecast run -c \
  --tenant public \
  --namespace default \
  --topic-base files \
  -w /home/mpeterma/Dokumente

Was passiert dabei?

  • -w legt das beobachtete Verzeichnis fest
  • --tenant, --namespace, --topic-base bestimmen den Topic-Namespace
  • -c aktiviert Chunked-Upload

Filecast läuft nun im Hintergrund und reagiert auf jede neue Datei im Zielverzeichnis.

💡 Praktischer Hinweis
Zum Testen einfach eine Datei anlegen: echo "Hello Pulsar" > ~/Dokumente/test.txt Kurz darauf sollte Filecast sie im passenden Topic veröffentlichen.

Verifizieren mit pulsar-cli

Mit der Pulsar CLI kann man prüfen, ob die Nachrichten korrekt im Pulsar-Broker landen:

export PULSAR_URL=pulsar://localhost:6650

./pulsar-cli consumer --regex -t 'persistent://public/default/files/.*' -s debug-subscriber

Damit werden alle Topics abonniert, die zu Filecast gehören. Sobald eine Datei geschrieben und geschlossen wird, empfängt der Subscriber die zugehörigen Chunks.


Architektur-Skizze

[ Legacy-System ]
        |
        | (schreibt Datei)
        v
 [ Dateisystem-Folder ] <-- inotify --> [ Filecast ]
                                          |
                                          | (streamed chunks)
                                          v
                                  [ Apache Pulsar ]
                                          |
                                          v
                                [ Modernes Zielsystem ]
ℹ️ Lose Kopplung durch Events
Das Legacy-System weiß nichts von Pulsar. Das Zielsystem weiß nichts vom Filesystem. Die Verantwortung ist klar getrennt – nur das Event verbindet die beiden Welten.

Fazit

filecast ist ein kleines, aber wirkungsvolles Werkzeug, um bestehende Datei-basierte Schnittstellen in Echtzeit zu transformieren. Es bringt alte Integrationsmuster behutsam in die neue Welt der Event-Driven Architecture.

Statt Cronjobs und FTP gibt es nun Streaming und Persistenz. Statt Polling gibt es Reaktion. Und vor allem: Statt Batch gibt es Event.

📝 Proof statt PowerPoint

Das hier ist kein Konzept auf Folien – der Code ist Open Source und läuft:


Bildnachweis: Das Pulsar-Logo ist eine eingetragene Marke der Apache Software Foundation. Verwendung im Rahmen redaktioneller Berichterstattung gemäß den Marken- und Logo-Richtlinien der ASF.