Zum Inhalt springen

FORGE · Technik im Detail

Quellen anbinden.

Wie FORGE Datenbanken, SAP, Dateien und Ereignisströme anbindet, Änderungen aus dem Log der Quelle liest und jedem Feld seine Herkunft mitgibt.

FORGE liest aus den Systemen, die eine Organisation schon betreibt, und zwar über deren eigene Schnittstellen. Die Quelle bleibt führend. FORGE hält eine Abschrift, erfährt Änderungen aus dem Log der Quelle statt über volle Abfragen und gibt jedem Wert mit, woher er stammt. So ist die Anbindung ausgelegt.

Diese Seite beschreibt die Bauweise des Systems. Gebaut sind der Prototyp von Freigabe und Protokoll und der Demonstrator von KALKÜL; den ganzen Stand finden Sie unter Was heute steht.

Auf dieser Seite
  1. 01Ein Konnektor je Art von Quelle
  2. 02Änderungen aus dem Log der Quelle
  3. 03Inkrementell mit Wasserzeichen
  4. 04Schema erkennen und versionieren
  5. 05Herkunft je Feld
  6. 06Eckdaten
  7. 07Weiter

Ein Konnektor je Art von Quelle

Ein Konnektor kapselt genau eine Art von Quelle: Protokoll, Anmeldung, seitenweises Lesen, Wiederholung nach Fehlern. Relationale Datenbanken erreicht FORGE über JDBC oder ODBC mit einem Lesekonto, das nur die freigegebenen Schemata sieht. Dienste mit HTTP-Schnittstelle liest es über REST oder OData; ein OData-Dienst beschreibt seine Entitäten selbst im Dokument $metadata und liefert große Mengen seitenweise, in OData v4 über @odata.nextLink, in OData v2, wie es SAP Gateway oft anbietet, über __next.

SAP bindet FORGE auf drei Wegen an, je nachdem, was das System bereitstellt: über OData-Dienste des SAP Gateway, über RFC-fähige Funktionsbausteine und BAPIs und über IDocs, die SAP mit ALE als Nachrichten versendet. Welcher Weg gilt, entscheidet die Art der Daten: Stammdaten und Belege eher über OData oder BAPI, Bewegungen, die SAP ohnehin als Nachricht verschickt, über IDoc.

Dateien kommen über SFTP oder aus Objektspeichern mit S3-Schnittstelle, in den Formaten CSV, JSON, XML oder Parquet. Ereignisströme liest FORGE aus Apache Kafka als Mitglied einer Consumer-Gruppe: Jede Partition hat einen Offset, den FORGE nach der Verarbeitung festschreibt. Die Reihenfolge gilt je Partition, nicht über Partitionen hinweg; der Schlüssel einer Nachricht bestimmt ihre Partition und damit, welche Nachrichten geordnet bleiben.

Änderungen aus dem Log der Quelle

Wo die Quelle es erlaubt, liest FORGE Änderungen aus ihrem Transaktionslog statt aus den Tabellen. Bei PostgreSQL ist das die logische Replikation: Mit wal_level = logical, einer Publikation für die freigegebenen Tabellen und einem Replikationsslot liefert das Ausgabe-Plugin pgoutput jedes Einfügen, Ändern und Löschen je Zeile, gebündelt nach Transaktion und in der Reihenfolge der Commits. Der Slot hält das Write-Ahead-Log fest, bis FORGE den Empfang bis zu einer Position bestätigt hat.

Bei MySQL ist es das Binärlog im Zeilenformat (binlog_format = ROW, sinnvoll mit binlog_row_image = FULL). FORGE meldet sich dafür wie ein Replikat an und liest Ereignisse ab einer Position oder einer GTID. Andere Datenbanken haben eigene Wege, etwa Change Data Capture in SQL Server; Werkzeuge wie Debezium bündeln solche Verfahren hinter einer einheitlichen Form.

Log-basiertes Erfassen sieht auch Löschungen und Zwischenstände, die eine periodische Abfrage verpasst, und belastet die Quelle wenig; weil ein Replikationsslot das Log festhält, bis FORGE bestätigt, gehören eine Obergrenze wie max_slot_wal_keep_size und eine Überwachung dazu. Die Position im Log, bei PostgreSQL die LSN, bei MySQL Datei und Position oder die GTID, speichert FORGE erst, wenn die Änderungen sicher angekommen sind. Nach einem Neustart setzt der Konnektor dort wieder auf. Das ergibt Zustellung mindestens einmal; doppelt Gelesenes fällt über den Schlüssel der Zeile und die Logposition heraus.

Inkrementell mit Wasserzeichen

Nicht jede Quelle hat ein lesbares Log. Dann fragt FORGE inkrementell ab: nur Zeilen, deren Änderungsspalte über dem zuletzt gesehenen Wert liegt, dem Wasserzeichen. Gespeichert wird das Paar aus Zeitstempel und Primärschlüssel, damit Zeilen mit gleichem Zeitstempel an der Grenze einer Seite weder doppelt kommen noch verloren gehen.

Transaktionen können in anderer Reihenfolge festschreiben, als ihre Zeitstempel vergeben wurden. Eine Zeile mit älterem Zeitstempel kann darum erst nach einer jüngeren sichtbar werden. Jede Abfrage liest deshalb ein Sicherheitsfenster überlappend zurück und verwirft Stände, die FORGE nach Schlüssel und Version schon kennt.

Löschungen sieht eine solche Abfrage nicht. Sie kommen über Löschmarken der Quelle, über eine Protokolltabelle, die ein Trigger füllt, oder über einen periodischen Abgleich der Schlüsselmengen von Quelle und Abschrift.

SELECT *
  FROM quelltabelle
 WHERE geaendert_am > :wz_zeit
    OR (geaendert_am = :wz_zeit AND id > :wz_id)
 ORDER BY geaendert_am, id
 LIMIT :seite
Abfrage mit Wasserzeichen aus Zeitstempel und Schlüssel; je Datenbank mit LIMIT, FETCH FIRST oder TOP. Danach wird das Wasserzeichen auf die letzte gelesene Zeile gesetzt. Das Sicherheitsfenster muss länger sein als die längste Transaktion.

Schema erkennen und versionieren

Beim Anbinden liest FORGE die Beschreibung der Quelle, statt sie abzutippen: den Katalog einer Datenbank über information_schema oder JDBC-DatabaseMetaData, das $metadata-Dokument eines OData-Dienstes, die Schnittstelle von RFC-Bausteinen, bei Kafka ein Schema-Register mit Avro, JSON Schema oder Protobuf, bei Dateien eine Stichprobe mit abgeleiteten Typen.

Jedes erkannte Schema bekommt eine Version. Ändert die Quelle ihr Schema, vergleicht FORGE alt und neu. Eine neue optionale Spalte wird übernommen. Ein geänderter Typ, eine umbenannte oder entfernte Spalte hält die betroffene Abbildung an, bis jemand entscheidet, statt still falsche Werte zu schreiben.

Anbindung im Schnitt

Unten die Quellen, darüber je Art ein Konnektor, dann die Erfassung der Änderungen. Oben die Rohzone, in der jede Zeile mit ihrer Herkunft landet.

Anbindung von FORGE im Schnitt: Quellen, Konnektoren, Erfassung, RohzoneUnten die Quellen, darüber je Art ein Konnektor, dann die Erfassung der Änderungen. Oben die Rohzone, in der jede Zeile mit ihrer Herkunft landet.RohzoneNUR ANHÄNGENDZEILEHERKUNFTLOGPOSITIONErfassungÄNDERUNGENWAL · PGOUTPUTBINLOG · ROWWASSERZEICHENSCHEMAVERSIONKonnektorenJE ARTJDBC · ODBCRFC · BAPIIDOCODATASFTP · S3KAFKAQuellenBLEIBEN FÜHRENDDATENBANKERPPROZESSSOFTWAREDATEIENEREIGNISSTROMLIEST
  • Rohzone (nur anhängend): Zeile, Herkunft, Logposition.
  • Erfassung (Änderungen): WAL · pgoutput, Binlog · ROW, Wasserzeichen, Schemaversion.
  • Konnektoren (je Art): JDBC · ODBC, RFC · BAPI, IDoc, OData, SFTP · S3, Kafka.
  • Quellen (bleiben führend): Datenbank, ERP, Prozesssoftware, Dateien, Ereignisstrom.
  • liest: fließt von quellen nach roh.
SCHNITT VON VORN

Herkunft je Feld

Jeder Wert, der in FORGE ankommt, trägt seine Herkunft: Quelle, Objekt in der Quelle (Tabelle, Entität oder Thema), Schlüssel der Zeile, Feld, Logposition oder Wasserzeichen und den Zeitpunkt des Lesens. Die Rohzone speichert die Zeilen unverändert und nur anhängend; jede spätere Umformung verweist auf die Rohzeile, aus der sie entstand.

So lässt sich für jede Eigenschaft eines Objekts zurückverfolgen, aus welcher Zeile welcher Quelle sie stammt und in welchem Lauf sie übernommen wurde. Die Begriffe folgen W3C PROV: Entität, Aktivität, Agent. Für den Austausch der Herkunft mit anderen Werkzeugen ist OpenLineage vorgesehen.

Zugangsdaten der Konnektoren liegen in einem Speicher für Geheimnisse, nicht in der Konfiguration. Jede Anbindung nutzt ein eigenes Konto mit Leserecht auf die freigegebenen Objekte; Schreiben ist ein eigener Weg mit eigenem Recht. Bei PostgreSQL begrenzt die Publikation, welche Tabellen das Konto mit dem Attribut REPLICATION liest. Bei MySQL sieht das Replikationskonto das Binärlog des ganzen Servers; FORGE verwirft nicht freigegebene Schemata beim Lesen und speichert sie nicht, und reicht das nicht, liest FORGE von einem gefilterten Replikat oder mit Wasserzeichen.

Eckdaten

Datenbanken
JDBC, ODBC; Katalog über information_schema oder DatabaseMetaData
SAP
OData über SAP Gateway, RFC und BAPI, IDoc über ALE
Dienste
REST, OData v2 und v4 mit $metadata und seitenweisem Lesen
Dateien
SFTP, Objektspeicher mit S3-Schnittstelle; CSV, JSON, XML, Parquet
Ereignisströme
Apache Kafka, Offset je Partition, Schema-Register für Avro, JSON Schema, Protobuf
Änderungen
PostgreSQL logische Replikation (pgoutput, Replikationsslot), MySQL-Binlog im Zeilenformat, sonst Wasserzeichen
Zustellung
mindestens einmal; Doppeltes fällt über Schlüssel und Logposition heraus
Herkunft
Quelle, Objekt, Schlüssel, Feld, Position, Lesezeit; Begriffe nach W3C PROV

Weiter

Bringen Sie die Liste Ihrer Quellsysteme mit. Wir legen zu jedem den Weg der Anbindung fest.