Wie wird Schema Evolution in Apache Avro technisch gelöst, ohne die Abwärtskompatibilität zu gefährden?

Schema Evolution in Apache Avro basiert auf der technischen Trennung von Writer-Schema und Reader-Schema. Beim Deserialisieren eines Datensatzes liegen der Avro-Bibliothek beide Schemata vor: das Schema, mit dem die Daten geschrieben wurden (Writer-Schema), und das Schema, das die Anwendung aktuell zur Verarbeitung nutzt (Reader-Schema). Die sogenannte Schema-Resolution gleicht diese beiden Versionen ab und mappt die Felder entsprechend.

Damit die Abwärtskompatibilität gewahrt bleibt, muss ein Reader mit einem neuen Schema in der Lage sein, Daten zu verarbeiten, die mit einer älteren Version geschrieben wurden. Dies wird durch die strikte Einhaltung folgender Regeln erreicht:

ÄnderungstypBedingung für AbwärtskompatibilitätTechnisches Verhalten
Feld hinzufügenDefault-Wert muss definiert seinDer Reader nutzt den Default-Wert, wenn das Feld in den alten Daten fehlt.
Feld entfernenFeld muss einen Default-Wert gehabt habenDer Reader ignoriert das Feld im Writer-Schema einfach.
Typ ändernNur kompatible Promotionen (z. B. int $\rightarrow$ long)Avro konvertiert den Datentyp während der Resolution automatisch.
NamensänderungNutzung von Aliassen im Reader-SchemaDas Feld wird über den Alias korrekt dem neuen Namen zugeordnet.

In produktiven Systemen implementieren wir zur Verwaltung dieser Schemata eine zentrale Schema Registry. Anstatt das vollständige Schema an jede Nachricht anzuhängen, wird lediglich eine kompakte Schema-ID übertragen. Der Reader ruft das zugehörige Writer-Schema über diese ID aus der Registry ab und führt den Abgleich mit seinem lokalen Reader-Schema durch. Dieser Prozess verhindert Datenverlust und Laufzeitfehler bei der Evolution von Datenstrukturen.

Die Integration solcher Mechanismen ist ein Kernbestandteil unserer IT-Consulting & Digitale Strategie, um hochverfügbare Event-Driven Architectures zu realisieren. Ohne die Definition von Default-Werten führt jede Schema-Änderung zu einem Bruch der Kompatibilität, was in verteilten Systemen unmittelbar zu Fehlern in den Consumer-Services führt.

Wir empfehlen die konsequente Nutzung einer Schema Registry in Verbindung mit einer automatisierten "Backward"-Kompatibilitätsprüfung im CI/CD-Prozess, da manuelle Prüfungen bei einer steigenden Anzahl an Microservices unweigerlich zu inkonsistenten Datenzuständen führen.

Sergej Wiens

Sergej Wiens

Gründer & Software Architekt