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.
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 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.
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.
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?
-wlegt das beobachtete Verzeichnis fest--tenant,--namespace,--topic-basebestimmen den Topic-Namespace-caktiviert Chunked-Upload
Filecast läuft nun im Hintergrund und reagiert auf jede neue Datei im Zielverzeichnis.
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 ]
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.
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.