34 Reprocessing und Event Replay

Die Fähigkeit, Events erneut zu verarbeiten, ist eine der mächtigsten Eigenschaften Event-getriebener Systeme. Sie ermöglicht es, aus vergangenen Ereignissen neue Erkenntnisse zu gewinnen, Fehler zu korrigieren und Systeme zu modernisieren, ohne Daten zu verlieren. Diese Flexibilität unterscheidet Event-Systeme fundamental von traditionellen Datenbank-zentrierten Architekturen.

34.1 Motivation für Event Replay

Angenommen Ihr E-Commerce-System läuft seit zwei Jahren produktiv. Plötzlich möchten Sie eine neue Funktion einführen: Kundenlebenswert-Analysen. In einem traditionellen System müssten Sie mit den aktuell verfügbaren Daten arbeiten und könnten keine historischen Trends analysieren. In einem Event-getriebenen System hingegen können Sie alle vergangenen Bestellungen, Zahlungen und Kundeninteraktionen “replays” - als würden diese Ereignisse gerade erst auftreten.

Typische Anwendungsszenarien für Event Replay:

Die Herausforderung liegt darin, dass Events nicht einfach “nochmal abgespielt” werden können, als wären sie neu. Die Verarbeitung muss den historischen Kontext berücksichtigen und gleichzeitig mit dem laufenden System koordiniert werden.

34.2 Historical Data Processing

Historical Data Processing bedeutet, vergangene Events so zu verarbeiten, als würden sie zum ersten Mal auftreten. Dabei entstehen verschiedene Komplexitäten, die in der ursprünglichen Event-Verarbeitung nicht existierten.

Zeitliche Herausforderungen sind das erste Problem. Events aus der Vergangenheit tragen ihre ursprünglichen Timestamps, aber die Verarbeitung findet in der Gegenwart statt. Services müssen zwischen “Event-Zeit” und “Verarbeitungszeit” unterscheiden können.

Ein typisches Beispiel: Sie möchten einen neuen Recommendation-Service einführen, der auf Basis aller bisherigen Käufe Produktvorschläge macht. Die Events stammen aus zwei Jahren, sollen aber so verarbeitet werden, als würde der Service seit dem ersten Tag laufen.

Herausforderung Beschreibung Lösungsansatz
Zeitstempel-Konflikte Event-Zeit vs. aktuelle Zeit Separate Event-Zeit und Processing-Zeit
Dependency-Reihenfolge Services benötigen andere Services Topologische Sortierung der Abhängigkeiten
Volume-Management Millionen Events in kurzer Zeit Batch-Processing mit Rate-Limiting
State-Isolation Historische und aktuelle Daten trennen Separate Namespaces oder Partitionen

Batch vs. Stream Processing wird zur zentralen Architekturentscheidung. Während Live-Events typischerweise als Stream verarbeitet werden, eignet sich Historical Processing oft besser für Batch-Verarbeitung.

Bei Batch-Processing werden Events in größeren Blöcken verarbeitet, was höhere Durchsatzraten ermöglicht. Der neue Recommendation-Service könnte beispielsweise alle Events eines Monats als Batch verarbeiten, anstatt sie einzeln zu streamen.

Koordination mit Live-System ist kritisch. Während historische Events verarbeitet werden, kommen neue Live-Events hinzu. Die Services müssen beide Datenströme koordinieren, ohne Inkonsistenzen zu erzeugen.

Eine bewährte Strategie ist die zeitliche Partitionierung: Historische Events werden bis zu einem Cutoff-Zeitpunkt verarbeitet, ab dem Live-Events übernehmen. Der Übergang muss sorgfältig koordiniert werden, um keine Events zu verlieren oder doppelt zu verarbeiten.

34.3 State Reconstruction

State Reconstruction ist der Prozess, bei dem der aktuelle Zustand eines Systems aus der kompletten Event-Historie rekonstruiert wird. Dies ist besonders wertvoll, wenn Systeme ausfallen oder Daten beschädigt werden.

Vollständige Rekonstruktion bedeutet, dass aus den Events der gesamte Anwendungszustand wiederhergestellt wird. Im E-Commerce-Szenario würde das bedeuten: Alle Kundenprofile, Bestellstati, Lagerbestände und Zahlungsinformationen werden aus den ursprünglichen Events neu aufgebaut.

Der Vorteil ist offensichtlich: Selbst bei totalem Datenverlust kann das System komplett wiederhergestellt werden, solange die Events erhalten sind. Der Nachteil: Bei großen Systemen kann die Rekonstruktion Stunden oder Tage dauern.

Partielle Rekonstruktion fokussiert sich auf spezifische Teilbereiche. Wenn beispielsweise nur die Kundenprofile beschädigt sind, müssen nur Customer-Related Events replays werden. Dies reduziert die Wiederherstellungszeit erheblich.

Snapshot-basierte Rekonstruktion kombiniert regelmäßige Zustandsabbilder mit Event-Replay. Anstatt alle Events seit Systembeginn zu verarbeiten, wird vom letzten Snapshot ausgegangen und nur Events seit diesem Zeitpunkt replays.

Rekonstruktionstyp Zeitaufwand Vollständigkeit Anwendungsfall
Vollständig Hoch 100% Disaster Recovery
Partiell Mittel Spezifische Bereiche Fehlerkorrektur
Snapshot-basiert Niedrig 99%+ Routinewartung
Rolling Kontinuierlich 100% Live-Migration

Rolling Reconstruction ist eine fortgeschrittene Technik, bei der die Rekonstruktion während des laufenden Betriebs erfolgt. Neue Events werden parallel zu Historical Events verarbeitet, wobei das System kontinuierlich verfügbar bleibt.

Die Komplexität steigt erheblich, da beide Event-Ströme koordiniert werden müssen. Der Vorteil: Keine Downtime, auch bei umfangreichen Systemänderungen.

34.4 Version Migration

Version Migration ist notwendig, wenn sich Event-Schemas oder Verarbeitungslogik ändert. In einem lebenden System müssen neue Versionen mit bestehenden Daten kompatibel bleiben.

Schema Evolution ist die häufigste Ursache für Migrations-Bedarf. Wenn sich die Struktur von Events ändert, müssen historische Events in das neue Format überführt werden. Dies kann durch Event-Replay mit Schema-Transformation geschehen.

Beispiel: Das ursprüngliche OrderPlaced-Event enthielt nur Produktnamen. Die neue Version benötigt Produkt-IDs für bessere Referenzierung. Bei der Migration müssen alle historischen Events transformiert werden, wobei Produktnamen zu IDs aufgelöst werden.

Geschäftslogik-Migration tritt auf, wenn sich die Verarbeitungsregeln ändern. Ein typisches Szenario: Die Berechnung von Rabatten wird überarbeitet. Alle historischen Events müssen mit der neuen Logik verarbeitet werden, um konsistente Kundendaten zu gewährleisten.

Multi-Version Compatibility wird notwendig, wenn verschiedene System-Teile unterschiedliche Event-Versionen erwarten. Während der Migration müssen oft mehrere Event-Versionen parallel unterstützt werden.

// Vereinfachtes Beispiel für Version-kompatible Event-Verarbeitung
@Component
public class OrderProcessor {
    
    @KafkaListener(topics = "order.placed.v1")
    public void handleOrderV1(OrderPlacedEventV1 event) {
        // Legacy-Format verarbeiten
        OrderPlacedEventV2 converted = convertV1ToV2(event);
        processOrderEvent(converted);
    }
    
    @KafkaListener(topics = "order.placed.v2") 
    public void handleOrderV2(OrderPlacedEventV2 event) {
        // Neues Format direkt verarbeiten
        processOrderEvent(event);
    }
    
    private void processOrderEvent(OrderPlacedEventV2 event) {
        // Einheitliche Verarbeitung beider Versionen
    }
}

Migrations-Strategien variieren je nach Systemanforderungen:

Big Bang Migration stoppt das System, migriert alle Daten und startet mit der neuen Version. Einfach zu implementieren, aber mit längerer Downtime verbunden.

Graduelle Migration führt neue Versionen schrittweise ein. Alte und neue Services laufen parallel, bis alle Daten migriert sind. Komplexer, aber ohne Downtime.

Shadow Migration repliziert Events parallel in alte und neue Systeme. Nach Validierung wird auf das neue System umgeschaltet. Ressourcenintensiv, aber mit minimalen Risiken.

Die Wahl der Migrations-Strategie hängt von Business-Anforderungen, verfügbaren Ressourcen und Risiko-Toleranz ab. Event-getriebene Systeme bieten die einzigartige Möglichkeit, Migrationen durch Event Replay zu validieren, bevor sie produktiv werden.

Event Replay und Reprocessing sind fundamentale Fähigkeiten, die Event-getriebene Systeme von traditionellen Architekturen unterscheiden. Sie ermöglichen es, Systeme zu entwickeln, die nicht nur auf aktuelle Anforderungen reagieren, sondern sich auch an zukünftige Bedürfnisse anpassen können, ohne historische Daten zu verlieren.