Zurück zum Blog
ArtikelApril 27, 20267 Min.

Was passiert mit Ihrer Daten-Pipeline, wenn sich das Quellsystem ohne Vorwarnung ändert

Schema-Drift und unerwartete Änderungen im Upstream sind die Hauptursachen für stille Datenfehler. So vermeiden Sie Überraschungen.

Was passiert mit Ihrer Daten-Pipeline, wenn sich das Quellsystem ohne Vorwarnung ändert

Von Andrew Tan

Schema-Drift und upstream-breaking Changes sind die Hauptursache für stille Datenfehler. So verhindern Sie, dass Sie überrascht werden.


Das Feld, das alles zerstörte

Ein Fintech-Unternehmen, das ich kenne, hatte eine Zahlungsprozessor-Integration, die zwei Jahre lang reibungslos lief. Hunderttausende von Transaktionen pro Tag, solider Data Pipeline, zufriedenes Finanzteam. Dann begannen eines Morgens die Abstimmungsberichte, Unsinn zu produzieren. Die Umsatzzahlen waren um Größenordnungen falsch. Negative Zahlen, wo positive sein sollten.

Die Ursache wurde nach sechs Stunden gefunden. Ihr Zahlungsprozessor hatte stillschweigend ein Feld geändert — amount — von einem String zu einem Integer. Kein Versionssprung. Kein Migrationsleitfaden. Keine E-Mail. Sie haben es einfach gepusht. Die Konvertierungslogik der Pipeline hatte String-Operationen an diesem Feld durchgeführt, Cents abgeschnitten, Währungscodes geparst, und als plötzlich Integer ankamen, gab es keinen Fehler. Es lief weiter und produzierte Zahlen, die plausibel genug aussahen, um automatisierte Prüfungen zu bestehen, aber völlig falsch waren.

Sechs Stunden Ingenieurzeit. Zwei Tage Abstimmung im Finanzteam. Ein sehr unangenehmes Gespräch mit dem CFO. Alles, weil ein Anbieter einen Feldtyp geändert hat.

Ich habe Variationen dieser Geschichte mehrmals gesehen, als ich zählen kann. Das Quellsystem ändert sich ohne Vorwarnung. Die Pipeline stürzt nicht ab. Sie tut etwas Schlimmeres: Sie läuft weiter und produziert Müll.

Warum das nicht in Ihrem Monitoring auftaucht

Hier ist der kontraintuitive Teil. Die meisten Pipelines sind darauf ausgelegt, Verarbeitungsfehler zu erkennen, nicht Schemafehler.

Sie erhalten Benachrichtigungen, wenn ein Job nicht läuft. Sie erhalten Benachrichtigungen, wenn die Latenz ansteigt. Sie erhalten Benachrichtigungen, wenn die Zieldatenbank einen Schreibvorgang ablehnt. Was Sie normalerweise nicht erhalten, sind Benachrichtigungen, wenn sich der Input geändert hat und Ihre Verarbeitungslogik stillschweigend seitwärts gegangen ist.

Der Grund ist strukturell. Schema-Validierung wird oft als nachträglicher Gedanke betrachtet. Teams schreiben zuerst ihre Pipeline-Logik, kümmern sich später um die Validierung und implementieren sie dann nie wirklich, weil die Pipeline bereits läuft und es riskant erscheint, sie zu berühren.

So endet man mit einem System, das gegen Infrastrukturfehler kampferprobt ist und völlig blind für Verstöße gegen Datenverträge.

Drei Klassen von Upstream-Änderungen

Nicht alle Upstream-Änderungen sind gleichermaßen gefährlich. Drei Kategorien:

Additive Änderungen sind die freundlichen. Ein neues optionales Feld erscheint. Ein Array erhält einen zusätzlichen Elementtyp. Das Quellsystem wächst, ohne die bestehende Struktur zu brechen. Ihre Pipeline kommt damit in der Regel gut zurecht — Sie ignorieren einfach, was Sie nicht benötigen. Geringes Risiko.

Breaking Changes sind der offensichtliche Feind. Ein erforderliches Feld verschwindet. Ein Datentyp ändert sich. Ein Feld wird umbenannt. Diese neigen dazu, harte Fehler zu verursachen, was eigentlich in Ordnung ist. Ihre Pipeline stürzt ab, Sie erhalten eine Benachrichtigung, Sie beheben es. Schmerzhaft, aber erkennbar.

Stille Änderungen sind die schlimmsten. Dies sind Änderungen, die keine Fehler verursachen. Das Feld ist noch da. Der Typ ist technisch noch kompatibel. Aber die Semantik hat sich verschoben. Ein status-Feld, das früher "active" und "inactive" enthielt, enthält jetzt "enabled" und "disabled". Ihre Nullprüfungen bestehen immer noch. Ihre Zeilenanzahlen sehen immer noch normal aus. Ihre Dashboards füllen sich immer noch. Alles ist falsch.

Stille Änderungen sind die, die in CFO-Gesprächen enden.

Wo die meisten Pipelines versagen

Der Instinkt ist, mehr Validierung auf der Verarbeitungsebene hinzuzufügen. Typen überprüfen, bevor Sie konvertieren. Sicherstellen, dass erforderliche Felder vorhanden sind. Formprüfungen bei der Aufnahme durchführen.

Das hilft, aber es verfehlt das Kernproblem. Validierung auf der Verarbeitungsebene fängt Typfehler ab. Es fängt keinen semantischen Drift ab. Es fängt nicht den Fall ab, in dem ein Feld vorhanden ist, korrekt typisiert und völlig falsch in der Bedeutung ist.

Die wirkliche Verteidigung liegt in einer ganz anderen Schicht: dem Vertrag zwischen dem Quellsystem und Ihrer Pipeline.

Ein Vertrag definiert nicht nur die Struktur der Daten, sondern auch die Erwartungen daran. Feld X ist ein String, der einen währungsdenominierten Betrag in kleinen Einheiten darstellt. Feld Y ist ein Enum mit genau diesen vier Werten. Feld Z ist ein Zeitstempel in UTC, niemals null, immer innerhalb der letzten 90 Tage.

Wenn Sie diesen Vertrag explizit definieren und bei jeder Aufnahme dagegen testen, fangen Sie stille Änderungen ab, bevor sie nachgelagerte Daten korrumpieren. Sie fangen den Fall ab, in dem amount immer noch ein String ist, jetzt aber den vollen Betrag darstellt, anstatt den Betrag in kleinen Einheiten. Sie fangen den Fall ab, in dem das Enum einen fünften Wert erhält, den Ihre Pipeline noch nie gesehen hat.

Vertragstests auf der Pipeline-Ebene

Vertragstests sind in Microservices gut etabliert (Pact ist das gebräuchlichste Framework), aber in Data Pipelines untergenutzt. Die Grundidee ist einfach: Definieren Sie die Form und Semantik Ihres Inputs als formalen Vertrag und führen Sie Tests gegen diesen Vertrag jedes Mal durch, wenn Daten fließen.

In der Praxis bedeutet das drei Dinge.

Eine Schema-Spezifikation, die über Feldtypen hinausgeht. Einschließlich erwarteter Wertebereiche, Kardinalitätsbeschränkungen, der Beziehung zwischen Feldern. Nicht nur amount: integer, sondern amount: positive integer, max 10,000,000, represents cents.

Eine Monitoring-Schicht, die diese Prüfungen kontinuierlich durchführt, nicht nur beim Pipeline-Start. Ein fehlgeschlagener Check pro Lauf ist in Ordnung. Zehntausend fehlgeschlagene Checks bei 500.000 Datensätzen sind Ihr stiller Änderungsalarm.

Eine Alarmierungsschwelle, die auf Ihre Daten kalibriert ist. Wenn historisch 0,1 % der Datensätze eine null transaction_id haben (anomal, aber real), setzen Sie Ihren Alarm auf 1 %. Wenn die Nullrate 1 % erreicht, hat sich etwas geändert. Wenn sie 15 % erreicht, hat sich definitiv etwas geändert.

Lohnt es sich, das zu implementieren? Ja, mit einem Vorbehalt: Schreiben Sie Ihre Verträge zum Zeitpunkt der Integration, nicht nachträglich. Das Nachrüsten von Verträgen auf eine bestehende Pipeline ist schmerzhaft, weil Sie rückentwickeln müssen, was Sie als wahr angenommen haben. Der Zeitpunkt, um Ihre Erwartungen zu dokumentieren, ist, wenn Sie die Integration zum ersten Mal aufbauen, während das Wissen frisch ist.

Verteidigung gegen jede Klasse

Additive Änderungen: Ignorieren Sie sie einfach. Bauen Sie Ihre Pipeline so, dass sie nur das extrahiert, was Sie benötigen. Brechen Sie nicht bei unerwarteten Feldern.

Breaking Changes: Scheitern Sie laut und schnell. Ein harter Absturz mit einer klaren Fehlermeldung ist besser als stille Korruption. Strikte Validierung bei der Aufnahme der Felder, auf die Sie angewiesen sind.

Stille Änderungen: Hier verdient sich das Vertragstesten seine Sporen. Verfolgen Sie Verteilungen, nicht nur Strukturen. Wenn sich die Verteilung der status-Feldwerte plötzlich von 90 % "active" / 10 % "inactive" auf 50/50 verschiebt, hat sich etwas upstream geändert. Vielleicht ist es ein legitimer Geschäftswandel. Vielleicht ist es eine semantische Änderung in der Klassifizierung von Konten. In jedem Fall möchten Sie es wissen.

Wie layline.io damit umgeht

Die Herausforderung bei den meisten Pipeline-Frameworks besteht darin, dass Schemaänderungen Pipeline-Änderungen erfordern. Sie aktualisieren eine Feldzuordnung, setzen den Job neu ein und hoffen, dass nichts anderes kaputt geht. Die Feedback-Schleife zwischen "upstream geändert" und "Pipeline angepasst" dauert Stunden oder Tage.

In layline.io trennt das Verarbeitungsmodell die logische Arbeit (was Sie mit den Daten tun möchten) vom physischen Format (in welcher Form die Daten ankommen). Schema-Evolution, neue Felder, umbenannte Felder, Typänderungen können durch Konfiguration anstelle von Code gehandhabt werden. Ihre Logik arbeitet auf logischen Feldern, die aus dem physischen Schema abgebildet sind, sodass Sie bei Änderungen des physischen Schemas die Zuordnung aktualisieren können, ohne die Pipeline neu zu schreiben.

Das eliminiert nicht die Notwendigkeit für Vertragstests. Sie möchten immer noch wissen, wann etwas Unerwartetes ankommt. Aber es reduziert den Explosionsradius erheblich. Eine Upstream-Änderung, die eine Neuschreibung und Neudeployment der Pipeline erfordert hätte, wird zu einem Konfigurationsupdate, das Minuten dauert.

Es bedeutet auch, dass Sie sowohl Batch- als auch Streaming-Integrationen gegen dasselbe Quellsystem mit derselben Schema-Handhabung ausführen können. Wenn der Zahlungsprozessor ein Feld ändert, beheben Sie es einmal — nicht separat für Ihre Real-time Fraud Detection Pipeline und Ihren nächtlichen Abstimmungs-Batch-Job.

Die praktische Erkenntnis

Beginnen Sie mit den Verträgen, die Sie nicht haben. Wählen Sie Ihre drei kritischsten Upstream-Integrationen, bei denen eine stille Datenänderung den größten Schaden verursachen würde, und schreiben Sie auf, was Sie tatsächlich von jedem Feld erwarten. Nicht nur der Typ. Der Bereich, die erlaubten Werte, die semantische Bedeutung.

Bauen Sie dann ein Monitoring auf, das Abweichungen von diesen Erwartungen erkennt. Nicht perfekt, nicht umfassend, nur die wichtigsten Integrationen zuerst.

Die meisten Teams arbeiten ohne explizite Verträge, bis etwas kaputt geht. Die Teams, die mit ihnen arbeiten, erfahren von Upstream-Änderungen zu ihren eigenen Bedingungen, nicht um 3 Uhr morgens mit korrumpierten Daten.


Andrew Tan ist ein Serienunternehmer und Gründer von layline.io, der Unternehmensdatenverarbeitungsinfrastrukturen aufbaut, die sowohl Batch- als auch Echtzeit-Workloads in großem Maßstab bewältigen.

Share:

Enjoyed this article?

Subscribe to get more insights delivered to your inbox.