Be Software Architecture Wise
Be Wise Apps

Read in English · Leer en español · Lire en français

Kapitel 7 von 12 · Mittelstufe bis Fortgeschritten

Datenarchitektur

Daten überdauern Code, und in verteilten Systemen sind sie der am schwierigsten richtig zu gestaltende Teil. Dieses Kapitel behandelt, wem welche Daten gehören und warum eine gemeinsame Datenbank Services koppelt, wie man zwischen relationalen und anderen Datenbanken wählt, was Transaktionen und Isolationsebenen wirklich garantieren, wie Replikation und Partitionierung funktionieren und versagen, CQRS und Event-Sourcing, Caching, die Weiterentwicklung von Schemas ohne Ausfallzeit sowie Analytics, Streaming und Data Mesh. Es richtet sich an Entwicklungs- und Architekturfachleute, die die verteilten Stile aus Kapitel 6 bereits kennen und fundierte, gut begründbare Entscheidungen über Daten treffen müssen.

Videoeinführung in Kapitel 7

7 Min. · auf Englisch gesprochen, mit Untertiteln
Nur anhören (Audio)
Transkript lesen

Willkommen zu Kapitel 7: Datenarchitektur. Code lässt sich in Monaten neu schreiben, Daten aber leben Jahrzehnte. Kundenkonten, Hauptbücher, Bestellungen und Krankengeschichten überdauern jedes Framework und jeden Service, der mit ihnen arbeitet. Diese Daten zu migrieren ist langsam, riskant und teuer. Deshalb gehören die Entscheidungen in diesem Kapitel zu den bedeutsamsten, die ein Architekt trifft: Sie sind schwer rückgängig zu machen, weitreichend und entscheidend für Verfügbarkeit, Performance und Änderbarkeit.

Dieses Kapitel richtet sich an Entwicklungs- und Architekturfachleute, die die verteilten Stile aus Kapitel 6 schon kennen und nun fundierte, begründbare Entscheidungen über Daten treffen müssen. Es baut direkt auf Kapitel 6 auf. Code in Services aufzuteilen ist die leichte Hälfte. Sobald es mehrere Services gibt, muss jemand entscheiden, wer welche Daten ändern darf, wie andere sie sehen und was geschieht, wenn Kopien voneinander abweichen. Es setzt außerdem die Datenbankgrundlagen aus dem Abschnitt über das Speichern von Daten in Kapitel 0 voraus. Wenn Tabellen, Abfragen und Transaktionen neu für Sie sind, beginnen Sie dort. Und es führt weiter zu Kapitel 8, das diese Daten und das System als Ganzes schützt.

Das Kapitel hat acht Abschnitte und folgt durchgehend zwei Beispielen: einer Essenslieferplattform mit abendlichem Ansturm, Kurierstandorten und Speisekarten und einer Onlinebank, bei der es inakzeptabel ist, eine einzige Zahlung zu verlieren oder doppelt zu zählen. Abschnitt sieben Punkt eins, über Datenhoheit, legt die wichtigste Regel fest: Jede wichtige Tatsache sollte genau ein System of Record und genau einen Schreiber haben. Er erklärt, warum eine gemeinsame Datenbank Services koppelt, wie sauber ihr Code auch getrennt sein mag. Abschnitt sieben Punkt zwei gibt einen Überblick über relationale, Dokument-, Key-Value-, Graph-, Zeitreihen- und andere Speicher. Er begründet, warum die relationale Datenbank der richtige Standard für Systems of Record bleibt und jeder spezialisierte Speicher sich seinen Platz verdienen muss. Abschnitt sieben Punkt drei blickt unter das vertraute Akronym ACID auf die Anomalien durch Nebenläufigkeit, etwa Lost Updates und Write Skew, und darauf, was Isolationsebenen in verbreiteten Datenbanken wirklich garantieren. Abschnitt sieben Punkt vier erklärt, wie Datenbanken Daten über Maschinen kopieren und aufteilen, was Replikationsverzögerung und Failover mit der Korrektheit machen und wie man einen Shard-Schlüssel anhand der Zahlen wählt.

Hier ist der erste und wichtigste Gedanke des Kapitels, aus Abschnitt sieben Punkt eins. Das Bild vergleicht zwei Wege, drei Services ihre Daten zu geben. Links lesen und schreiben die Services für Bestellungen, Küche und Lieferung alle eine gemeinsame Datenbank mit Bestellungen, Speisekarten und Kurieren. Jeder Service kann jede Tabelle ändern, also ist jede Tabelle eine öffentliche Schnittstelle, und jede Schemaänderung braucht ein koordiniertes Release. Rechts hat jeder Service seine eigene Datenbank. Jedes Schema ist privat, es gibt keine Joins über Datenbanken hinweg, und Daten überqueren die Grenzen nur über API-Aufrufe und Events. Jetzt kann jeder Eigentümer sein Schema allein ändern. Diese Unabhängigkeit hat ihren Preis. Joins, Transaktionen und referenzielle Integrität über Services hinweg müssen durch APIs, Events, Sagas und Reporting-Pipelines ersetzt werden, und der Abschnitt zeigt, wie man Daten liest, die einem nicht gehören.

Die zweite Hälfte des Kapitels behandelt Daten, die aus den Systems of Record abgeleitet werden, und Veränderung über die Zeit. Abschnitt sieben Punkt fünf behandelt Command Query Responsibility Segregation, kurz CQRS, und Event-Sourcing. Sie trennen das Modell, das Änderungen annimmt, von den Modellen, die Abfragen beantworten, und speichern eine Ereignishistorie statt des aktuellen Zustands, zu einem echten Preis an Komplexität. Abschnitt sieben Punkt sechs handelt vom Caching: Kopien nahe am Ort ihres Bedarfs vorzuhalten, vom Browser bis zur Datenbank, einschließlich der Stampedes, die ein System lahmlegen können, wenn ein beliebter Eintrag abläuft. Abschnitt sieben Punkt sieben geht davon aus, dass sich jedes Schema, ob Datenbanktabellen, API-Payloads oder Events, im laufenden Betrieb ändern wird. Kompatibilitätsregeln und das Expand-and-Contract-Muster ermöglichen diese Änderung ohne Ausfallzeit. Zum Schluss geht Abschnitt sieben Punkt acht vom Betreiben des Geschäfts zu seinem Verstehen über: Data Warehouses, Data Lakes und Lakehouses, Stream Processing und Data Mesh, ein Weg, analytische Daten entlang von Domänen zu organisieren.

Die Abschnitte bilden eine Kette, und dieses Diagramm aus Abschnitt sieben Punkt zwei zeigt diese Kette an einer Essenslieferplattform. Bestellungen und Speisekarten schreiben jeweils in ihre eigene PostgreSQL-Datenbank. Das sind die einzigen beiden Systems of Record, und sie halten Bestellungen, Zahlungen und Speisekarten. Alles andere ist eine bewusste Kopie. Kurierpositionen liegen in einem In-Memory-Key-Value-Store und laufen nach dreißig Sekunden ab. Change Data Capture kopiert Speisekartenänderungen mit wenigen Sekunden Verzögerung in eine Suchmaschine. Und ein Data Warehouse erhält Bestellungen, Speisekarten und Stichproben von Kurierpositionen für Analytics, Stunden alt. Jede Kopie ist für einen Zweck schneller oder bequemer, jede ist um ein gewisses Maß veraltet, und jede lässt sich neu aufbauen.

Diese Kette führt zu dem einen Gedanken, den Sie aus diesem Kapitel mitnehmen sollten. Für jedes wichtige Datum sollten Sie drei Fragen beantworten können. Erstens: Wer ist sein einziger Schreiber? Zweitens: Wo werden seine Regeln durchgesetzt? Und drittens: Wie veraltet darf jede Kopie davon sein? Die meisten Datenprobleme in realen Systemen, etwa Bestellungen, deren Status rückwärts springt, Berichte, die dem Hauptbuch widersprechen, Doppelbuchungen und Kunden, die ihre eigenen Änderungen nicht sehen, entstehen, weil eine dieser Fragen nicht bewusst beantwortet wurde. Die Techniken in diesem Kapitel sind Wege, sie gut zu beantworten, und jede ist eine Abwägung zwischen Konsistenz, Verfügbarkeit, Performance, Kosten und dem Aufwand für den Betrieb des Systems.

Am Ende des Kapitels können Sie die Hoheit über Daten zuweisen, auch in den heiklen Fällen, in denen mehrere Services dieselben Daten schreiben wollen. Sie können für jeden Datenbestand eine Datenbank nach Form, Zugriffsmustern, Konsistenzbedarf und Größenordnung wählen und die Kosten jedes zusätzlichen Speichers begründen. Sie wissen, wie man einen Lese-, Änderungs- und Schreibpfad mit Sperren, Versionsprüfungen oder serialisierbaren Transaktionen absichert. Und Sie können Schemaänderungen mit Kompatibilitätsregeln und Expand and Contract so planen, dass sie keine Ausfallzeit brauchen.

Weil die Abschnitte eine Kette bilden, lesen Sie sie am besten der Reihe nach. Jeder steht aber auch für sich, sodass Sie direkt zu dem Abschnitt springen können, den Sie brauchen. Planen Sie für das ganze Kapitel etwa dreieinhalb Stunden Lesezeit ein. Jeder Abschnitt endet mit Fragen zur Selbstkontrolle. Beantworten Sie sie im Kopf, bevor Sie sich die Antworten ansehen; so sehen Sie schnell, was hängen geblieben ist. Wenn Sie so weit sind, gibt es einen freiwilligen Kapiteltest, der etwa fünfundvierzig Minuten dauert. Er hat zwanzig Multiple-Choice-Fragen und zwei schriftliche Antworten. Die Bestehensgrenze liegt bei achtzig Prozent.

So ist das Kapitel aufgebaut. Beginnen Sie mit Abschnitt sieben Punkt eins über Datenhoheit und Datenbank pro Service, wo die Regel „ein Schreiber für jede Tatsache“ ausführlich dargelegt wird. Bis gleich.

Kapitel herunterladen (PDF)In der App lesen

Auf einen Blick

Das lernen Sie

  • Erklären, warum eine gemeinsame Datenbank Services koppelt, und die Datenhoheit zuweisen, auch in Fällen, in denen mehrere Services dieselben Daten schreiben.
  • Für jeden Datenbestand eine Datenbank nach Datenform, Zugriffsmustern, Konsistenzanforderungen, Skalierung, Betrieb und Fähigkeiten des Teams auswählen und die Kosten jedes zusätzlichen Speichers begründen.
  • Die Isolationsebenen und die Anomalien, die sie zulassen, unterscheiden, darunter Lost Updates und Write Skew, und einen Read-Modify-Write-Pfad mit Sperren, Versionsprüfungen oder serialisierbaren Transaktionen absichern.
  • Leader-Follower-, Multi-Leader- und Leaderless Replication erklären, ebenso die Anomalien durch Replikationsverzögerung und die Risiken von Failover und Split Brain.
  • Ein Partitionierungsschema und einen Shard-Schlüssel anhand gemessener Volumina und Abfragen wählen und konsistentes Hashing, Hot Keys und Sekundärindizes erklären.
  • Entscheiden, wann CQRS, Event-Sourcing und Caching ihre Kosten wert sind, und ihre typischen Fehlerbilder vermeiden.
  • Schemaänderungen mit Kompatibilitätsregeln und dem Expand-and-Contract-Muster so planen, dass sie keine Ausfallzeit brauchen.
  • Operative und analytische Datenarchitekturen unterscheiden: Data Warehouses, Data Lakes, Lakehouses, Stream Processing und Data Mesh.

Bevor Sie beginnen

Kapitel 6, besonders die Abschnitte über Microservices, ereignisgesteuerte Architektur, Konsistenz, CAP und PACELC sowie Sagas. Der Abschnitt über das Speichern von Daten in Kapitel 0 deckt die hier vorausgesetzten Datenbankgrundlagen ab.

Zeit

Etwa 3½ Stunden Lesezeit; 45 Minuten für den Test.

Schlüsselbegriffe

System of Record · Datenbank pro Service · polyglotte Persistenz · Isolationsebene · Snapshot Isolation · Write Skew · Replikationsverzögerung · konsistentes Hashing · CQRS · Event-Sourcing · Cache-Aside · Expand and Contract · Lakehouse · Data Mesh

Warum Daten der schwierige Teil sind

Code lässt sich in Monaten neu schreiben; Daten leben Jahrzehnte. Kundenkonten, Hauptbücher, Bestellungen und Krankengeschichten überdauern jedes Framework und jeden Service, der mit ihnen arbeitet, und sie zu migrieren ist langsam, riskant und teuer. Deshalb gehören die Entscheidungen in diesem Kapitel zu den bedeutsamsten, die ein Architekt trifft, im Sinne von Kapitel 1: Sie sind schwer rückgängig zu machen, weitreichend und entscheidend für Qualitätsmerkmale wie Verfügbarkeit, Performance und Änderbarkeit.

Kapitel 6 hat Systeme in Services aufgeteilt, die über ein Netzwerk kommunizieren. Code aufzuteilen ist die leichte Hälfte. Sobald es mehrere Services gibt, muss jemand entscheiden, wer welche Daten ändern darf, wie andere sie sehen, welche Garantien gelten, wenn viele Nutzer gleichzeitig handeln, und was geschieht, wenn Kopien der Daten voneinander abweichen. Das Kapitel folgt durchgehend zwei Beispielen: einer Essenslieferplattform mit ihrem abendlichen Ansturm, Kurierstandorten und Speisekarten und einer Onlinebank, bei der es inakzeptabel ist, auch nur eine einzige Zahlung zu verlieren oder doppelt zu zählen.

Daten besitzen, speichern und schützen

Die ersten vier Abschnitte behandeln die operativen Daten, auf denen Systeme laufen. Datenhoheit legt die wichtigste Regel fest: Jede wichtige Tatsache sollte genau ein System of Record und genau einen Schreiber haben. Der Abschnitt erklärt, warum eine gemeinsame Integrationsdatenbank Services koppelt, wie sauber ihr Code auch getrennt sein mag, wie man Fälle löst, in denen mehrere Services dieselben Daten schreiben wollen, wie man Daten liest, die einem nicht gehören, und wie Datenverträge gemeinsam genutzte Daten verlässlich machen.

Eine Datenbank wählen gibt einen Überblick über relationale, Dokument-, Key-Value-, Wide-Column-, Graph-, Zeitreihen-, Such-, Vektor- und Distributed-SQL-Speicher und begründet, warum die relationale Datenbank der richtige Standard für Systems of Record bleibt und spezialisierte Speicher sich ihren Platz verdienen müssen, indem sie eine Anforderung erfüllen, die der Standard nicht erfüllen kann. Transaktionen und Isolation blickt unter das vertraute Akronym ACID auf die Anomalien, die Nebenläufigkeit verursacht, etwa Lost Updates und Write Skew, darauf, was Isolationsebenen in PostgreSQL, MySQL, Oracle und SQL Server wirklich garantieren, und darauf, wann Sperren, Versionsprüfungen oder serialisierbare Transaktionen angebracht sind. Replikation und Partitionierung erklärt, wie Datenbanken Daten über Maschinen hinweg kopieren und aufteilen, was Replikationsverzögerung und Failover mit der Korrektheit machen und wie man einen Shard-Schlüssel anhand der Zahlen wählt.

Daten ableiten, cachen und weiterentwickeln

Die zweite Hälfte behandelt Daten, die aus den Systems of Record abgeleitet werden, und Veränderung über die Zeit. CQRS und Event-Sourcing trennt das Modell, das Änderungen annimmt, von den Modellen, die Abfragen beantworten, und zeigt, wie das Speichern einer Ereignishistorie statt des aktuellen Zustands Audits und zeitbezogene Abfragen ermöglicht, zu einem echten Preis an Komplexität. Caching behandelt die Muster, Ebenen und Fehlerbilder des Vorhaltens von Kopien nahe am Ort ihres Bedarfs, vom Browser bis zur Datenbank, einschließlich der Stampedes, die ein System lahmlegen können, wenn ein beliebter Eintrag abläuft.

Schemaevolution befasst sich damit, dass sich jedes Schema, ob Datenbanktabellen, API-Payloads oder Events, im laufenden Betrieb ändern wird, und zeigt, wie Kompatibilitätsregeln und das Expand-and-Contract-Muster Änderungen ohne Ausfallzeit ermöglichen. Zum Schluss geht Analytics und Streaming vom Betreiben des Geschäfts zu seinem Verstehen über: Data Warehouses, Data Lakes und Lakehouses, Stream Processing und Data Mesh als Weg, analytische Daten entlang von Domänen zu organisieren.

Wie die Abschnitte zusammenhängen

Die Abschnitte bilden eine Kette. Die Datenhoheit entscheidet, wo jede Tatsache geschrieben wird. Die Wahl der Datenbank und ihre Transaktionsgarantien entscheiden, welche Regeln sich innerhalb dieses Eigentümers günstig durchsetzen lassen. Replikation und Partitionierung entscheiden, wie die Daten des Eigentümers Ausfälle überstehen und über eine Maschine hinauswachsen. Alles andere im Kapitel ist eine bewusste Kopie: Read Models, Caches, Suchindizes, Data Warehouses und Streams. Jede Kopie ist für einen bestimmten Zweck schneller oder bequemer, und jede ist um ein gewisses Maß veraltet. Die Schemaevolution sorgt dafür, dass sich der Eigentümer und alle seine Kopien ändern können, ohne einander zu beschädigen.

Das Kapitel setzt das Vokabular verteilter Systeme aus Kapitel 6 voraus, besonders Konsistenzmodelle, ereignisgesteuerte Architektur sowie Sagas und das Outbox-Muster. Es führt weiter zu Kapitel 8, das diese Daten schützt, und zu Kapitel 9, das die Systeme, die sie halten, schnell und verfügbar hält.

Der eine Gedanke, den Sie mitnehmen sollten

Für jedes wichtige Datum sollten Sie drei Fragen beantworten können: Wer ist sein einziger Schreiber, wo werden seine Regeln durchgesetzt, und wie veraltet darf jede Kopie davon sein? Die meisten Datenprobleme in realen Systemen, etwa Bestellungen, deren Status rückwärts springt, Berichte, die dem Hauptbuch widersprechen, Doppelbuchungen und Kunden, die ihre eigenen Änderungen nicht sehen, entstehen, weil eine dieser Fragen nicht bewusst beantwortet wurde. Die Techniken in diesem Kapitel sind Wege, sie gut zu beantworten, und jede von ihnen ist eine Abwägung zwischen Konsistenz, Verfügbarkeit, Performance, Kosten und dem Aufwand für den Betrieb des Systems.

Die 8 Abschnitte

7.1 · Mittelstufe · 24 Min.DatenhoheitWer welche Daten ändern darf, warum eine gemeinsame Datenbank Services koppelt, wie man gemeinsame Datenhoheit auflöst und wie man Daten liest, auswertet und vertraglich regelt, die einem nicht gehören.Lesen →7.2 · Mittelstufe · 25 Min.Eine Datenbank wählenWofür jede Datenbankfamilie gut und schlecht geeignet ist, von relational bis zu Vektordatenbanken und Distributed SQL, und wie man nach Datenform, Zugriffsmustern, Konsistenz, Skalierung, Betrieb und Fähigkeiten des Teams auswählt.Lesen →7.3 · Fortgeschritten · 28 Min.TransaktionenWas ACID wirklich garantiert, die Anomalien, die Isolationsebenen zulassen, wie MVCC und Snapshot Isolation funktionieren, warum die Namen der Ebenen irreführen und wann man Sperren, Versionsprüfungen oder serialisierbare Transaktionen verwendet.Lesen →7.4 · Fortgeschritten · 30 Min.Replikation und PartitionierungWie Datenbanken Daten für Verfügbarkeit und Leseskalierung kopieren, was Replikationsverzögerung und Failover mit der Korrektheit machen und wie Partitionierung nach Bereich oder Hash, konsistentes Hashing und Sekundärindizes ein Sharding-Design prägen.Lesen →7.5 · Fortgeschritten · 26 Min.CQRS und Event-SourcingDas Modell, das Daten ändert, von den Modellen trennen, die sie lesen, Zustand als nur anfügbare Folge von Ereignissen speichern, und die echten Kosten: Eventual Consistency, Versionierung von Ereignissen und personenbezogene Daten.Lesen →7.6 · Mittelstufe · 24 Min.CachingWarum Caches Systeme beschleunigen und was sie kosten: Cache-Aside, Read-Through, Write-Through, Write-Behind und Refresh-Ahead, TTLs und Invalidierung, Stampedes, Caching-Ebenen, HTTP-Header und Verdrängung.Lesen →7.7 · Mittelstufe · 25 Min.SchemaevolutionDatenbank-, API- und Event-Schemas ändern, während das System weiterläuft: Abwärts-, Aufwärts- und Vollkompatibilität, Expand and Contract, Migrationswerkzeuge, große Backfills und Schema Registries für Avro und Protocol Buffers.Lesen →7.8 · Fortgeschritten · 27 Min.Analytics und StreamingWie analytische Daten architektonisch aufgebaut werden: OLTP und OLAP im Vergleich, Data Warehouses und Sternschemata, ETL und ELT, Data Lakes und Lakehouses, Stream Processing mit Ereigniszeit und Watermarks, Lambda und Kappa sowie Data Mesh.Lesen →

Kapiteltest

Prüfen Sie Ihr Verständnis von Kapitel 7

Optional: 20 Multiple-Choice-Fragen und 2 kurze schriftliche Antworten, jedes Mal neu aus einem Pool von 72 Fragen gezogen. Bestehensgrenze 80 %. Wer jeden Kapiteltest und anschließend die Abschlussbewertung besteht, erhält das Be Wise Abschlusszertifikat.

Den Test zu Kapitel 7 in der App ablegen

Weiterführende Literatur