Read in English · Leer en español · Lire en français
Kapitel 6 von 12 · Mittelstufe bis Fortgeschritten
Architekturstile II: Verteilte Systeme
Dieses Kapitel führt die Architektur über das Netzwerk hinaus. Es erklärt, wann sich die Verteilung eines Systems lohnt, welche Trugschlüsse sie schwieriger machen, als sie aussieht, und welche verteilten Hauptstile es gibt: servicebasierte Architektur, serviceorientierte Architektur, Microservices, ereignisgesteuerte Architektur, Serverless und Space-Based Architecture. Danach behandelt es die Mechanismen, auf die sie alle angewiesen sind: synchrone und asynchrone Kommunikation und API-Design, Konsistenzmodelle und das CAP-Theorem sowie verteilte Transaktionen mit Sagas und dem Outbox-Muster. Es richtet sich an Entwicklungs- und Architekturfachleute, die Systeme aus vielen Services entwerfen oder prüfen, und es ist präzise bei Ausfällen, Zustellgarantien und Konsistenz.
Videoeinführung in Kapitel 6
7 Min. · auf Englisch gesprochen, mit UntertitelnNur anhören (Audio)
Transkript lesen
Willkommen zu Kapitel 6: Architekturstile, Teil zwei, Verteilte Systeme. Kapitel 5 hat Stile beschrieben, bei denen das ganze System als eine Einheit deployt wird. Dieses Kapitel stellt dieselben Fragen über ein Netzwerk hinweg. Es erklärt, wann sich die Verteilung eines Systems lohnt, welche verteilten Hauptstile es gibt und auf welche Mechanismen sie alle angewiesen sind. Und es ist präzise bei Ausfällen, Zustellgarantien und Konsistenz.
Fast jedes System nennenswerter Größe ist heute in irgendeiner Form verteilt. Eine mobile App spricht mit Backend-Services, die Zahlungsanbieter, Kartendienste und Message Broker aufrufen, und die Services selbst laufen auf vielen Rechnern. Ein aufgeteiltes System kann unabhängige Skalierung, Fehlerisolation, unabhängige Releases und autonome Teams ermöglichen. Es bringt aber auch Probleme, die innerhalb eines Prozesses nicht auftreten können: verlorene oder doppelte Nachrichten, Services, die langsam statt tot sind, abweichende Daten zwischen Kopien und Ausfälle von Rechnern, von denen Sie gar nicht wussten, dass Sie von ihnen abhängen.
Das Kapitel ist als „Mittelstufe bis Fortgeschritten“ eingestuft. Es richtet sich an Entwicklungs- und Architekturfachleute, die Systeme aus vielen Services entwerfen oder prüfen. Es baut auf den Stilen aus Kapitel 5 und den Qualitäten aus Kapitel 2 auf, jetzt unter Netzwerkbedingungen. Insbesondere nutzt es Verfügbarkeit in Reihe und parallel, Kopplung und das Gesetz von Conway sowie das Architekturquantum, den modularen Monolithen und Bounded Contexts. Und es führt zu Kapitel 7, das den schwierigsten Teil der Verteilung behandelt: die Daten.
Die wichtigste Idee des Kapitels ist, dass Verteilung ein Tauschgeschäft ist, kein Upgrade. Jeder Nutzen wird mit Latenz, Konsistenz, Observability und Betriebsaufwand bezahlt. Wer gut architektiert, kann sagen, welcher Nutzen gekauft wird, zu welchem Preis und warum eine günstigere Lösung innerhalb eines Monolithen nicht genügt.
Das Kapitel geht vom Warum zum Wie. Abschnitt sechs Punkt eins legt die Gründe für eine Verteilung dar, die acht Trugschlüsse verteilter Systeme und den Teilausfall, und gibt Ihnen die Rechnung, mit der Sie den Preis bestimmen, bevor Sie sich festlegen. Abschnitt sechs Punkt zwei behandelt die servicebasierte Architektur, einen pragmatischen Mittelweg aus wenigen grobgranularen Domain Services, und die klassische serviceorientierte Architektur, einschließlich der Frage, warum sie in Ungnade fiel. Abschnitt sechs Punkt drei behandelt Microservices: an Bounded Contexts ausgerichtete Services, unabhängiges Deployment, eine Datenbank pro Service, wie groß ein Service sein sollte, und den verteilten Monolithen. Abschnitt sechs Punkt vier behandelt die ereignisgesteuerte Architektur: Ereignisse und Commands, Broker und Mediatoren, Zustellgarantien und Consumer, die dieselbe Nachricht gefahrlos zweimal empfangen können.
Hier ist die Rechnung aus Abschnitt sechs Punkt eins. Eine Bestellung durchläuft fünf Services: das API-Gateway, dann Bestellungen, Speisekarte, Preisgestaltung und Zahlung. Jeder wartet auf die Antwort des nächsten, und jeder für sich ist zu neunundneunzig Komma neun Prozent der Zeit verfügbar. Aber Verfügbarkeiten multiplizieren sich. Zusammen ergeben sie einen Anfragepfad von nur etwa neunundneunzig Komma fünf Prozent: rund drei Komma sechs Stunden Ausfallzeit im Monat. Und Latenzen addieren sich. Mit zwanzig Millisekunden Arbeit in jedem Service plus etwas für jeden Netzwerk-Hop liegt der Median bei etwa hundertzehn Millisekunden. Fünf für sich genommen respektable Services ergeben einen viel schwächeren Anfragepfad. Das ist der Preis der Verteilung, auf dem Papier ausgerechnet, bevor Sie irgendetwas bauen.
Dieses Diagramm zeigt den Teilausfall, das grundlegende Problem. Ein Bestellservice bittet einen Zahlungsservice, vierundzwanzig Pfund fünfzig zu autorisieren, und wartet auf die Antwort. Drei verschiedene Dinge können schiefgehen. Die Anfrage geht verloren, und es wurde nichts abgebucht. Der Zahlungsservice stürzt ab oder hängt, und niemand weiß Bescheid. Oder die Antwort geht verloren, und die Karte wurde belastet. Für den Aufrufer sehen alle drei gleich aus: keine Antwort vor dem Timeout. Deshalb muss jede Operation, die wiederholt werden kann, idempotent sein, das heißt, sie zweimal auszuführen hat dieselbe Wirkung wie einmal.
Die zweite Hälfte wendet sich den Mechanismen zu, auf die jeder verteilte Stil angewiesen ist. Abschnitt sechs Punkt fünf vergleicht synchrone und asynchrone Kommunikation und die Kopplung, die jede erzeugt, und behandelt API-Design, Versionierung und Contract Testing. Abschnitt sechs Punkt sechs handelt davon, was Leser kopierter Daten erwarten können: Konsistenzmodelle, was das CAP-Theorem wirklich besagt, und PACELC. Abschnitt sechs Punkt sieben erklärt, warum Two-Phase Commit zwischen Services vermieden wird und wie Sagas, kompensierende Transaktionen und das Outbox-Muster Geschäftsprozesse auch ohne ihn korrekt halten. Abschnitt sechs Punkt acht schließt mit zwei Stilen für besondere Lastprofile: Serverless-Funktionen, die auf null skalieren, und Space-Based Architecture, die Daten im Arbeitsspeicher hält, um extreme Lastspitzen wie einen Vorverkaufsstart zu überstehen.
Drei Gewohnheiten ziehen sich durch jeden Abschnitt. Erstens: Zählen Sie synchrone Abhängigkeiten, nicht Services. Die Zahl der Dinge, die alle im selben Moment funktionieren müssen, damit eine Anfrage gelingt, bestimmt ihre Verfügbarkeit und Latenz. Zweitens: Gehen Sie davon aus, dass Nachrichten verloren gehen, sich verzögern, doppelt ankommen und die Reihenfolge wechseln, und legen Sie Empfänger so aus, dass eine wiederholte Nachricht keinen Schaden anrichtet. Drittens: Legen Sie fest, wem jedes Datenstück gehört, denn die Datenhoheit entscheidet, wo Transaktionen möglich sind und wo Konsistenz über Services hinweg gesteuert werden muss. Kapitel 7 baut diese Gewohnheit zu einer vollständigen Behandlung der Datenarchitektur aus.
Wenn das Thema neu für Sie ist, lesen Sie zuerst die einleitende Zusammenfassung jedes Abschnitts und die Kästen mit der Überschrift „Wenn das neu für Sie ist“. Erfahrene Fachleute finden Präzision dort, wo es darauf ankommt. Das Kapitel braucht etwa dreieinhalb Stunden Lesezeit. Zwei Beispiele kehren immer wieder. Die Essenslieferplattform zeigt gewöhnliches verteiltes Design. Ein Ticketsystem für eine Stadiontournee zeigt, was sich ändert, wenn Zehntausende Menschen in derselben Sekunde dieselben wenigen Plätze wollen. Jeder Abschnitt endet mit einigen Fragen zur Selbstkontrolle. Beantworten Sie sie im Kopf, bevor Sie nachsehen. Wenn Sie so weit sind, legen Sie den optionalen Kapiteltest ab: zwanzig Multiple-Choice-Fragen und zwei schriftliche Antworten, in etwa fünfundvierzig Minuten. Die Bestehensgrenze liegt bei achtzig Prozent.
Das ist die Übersicht über Kapitel 6. Beginnen Sie mit Abschnitt sechs Punkt eins, wo wir die Gründe für eine Verteilung gegen die Trugschlüsse abwägen, die sie schwieriger machen, als sie aussieht. Bis gleich.
Auf einen Blick
Das lernen Sie
- Die legitimen Gründe für die Verteilung eines Systems erklären und die Kosten, die jeder Grund mit sich bringt.
- Die acht Fallacies of Distributed Computing und den Teilausfall beschreiben und Antworten darauf entwerfen.
- Verfügbarkeit und Latenz einer Kette synchroner Aufrufe berechnen und Änderungen vorschlagen, die beide verbessern.
- Servicebasierte Architektur, klassische SOA und Microservices vergleichen und für eine gegebene Organisation zwischen ihnen wählen.
- Die Granularität von Services festlegen, indem man Disintegratoren gegen Integratoren abwägt, und den verteilten Monolithen erkennen.
- Ereignisse, Commands und Nachrichten, Broker- und Mediator-Topologie sowie Fowlers vier Event-Muster unterscheiden.
- Zustellgarantien erklären, warum „Exactly once“ sorgfältig definiert werden muss und wie idempotente Consumer funktionieren.
- Kommunikationsstile, Konsistenzstufen und Transaktionsmuster (Sagas, Outbox) für verteilte Abläufe wählen.
Bevor Sie beginnen
Kapitel 0 bis 5, besonders Verfügbarkeit in Reihe und parallel (Kapitel 2, Abschnitt 2.5), Kopplung und das Gesetz von Conway (Kapitel 3) sowie das Architekturquantum, der modulare Monolith und Bounded Contexts (Kapitel 5).
Zeit
Etwa 3½ Stunden Lesezeit; 45 Minuten für den Test.
Schlüsselbegriffe
Verteiltes System · Teilausfall · Fallacies of Distributed Computing · Zeitliche Kopplung · Servicebasierte Architektur · Enterprise Service Bus · Microservices · Unabhängige Deploybarkeit · Datenbank pro Service · Ereignisgesteuerte Architektur · At-least-once-Zustellung · Idempotenter Consumer · CAP-Theorem · Saga
Warum dieses Kapitel wichtig ist
Kapitel 5 hat Stile beschrieben, bei denen das ganze System als eine Einheit deployt wird. Dieses Kapitel stellt dieselben Fragen über ein Netzwerk hinweg. Fast jedes System nennenswerter Größe ist heute in irgendeiner Form verteilt: Eine mobile App spricht mit Backend-Services, die Zahlungsanbieter, Kartendienste und Message Broker aufrufen, und die Services selbst laufen auf vielen Rechnern. Ein aufgeteiltes System kann unabhängige Skalierung, Fehlerisolation, unabhängige Releases und autonome Teams ermöglichen. Es bringt aber auch eine Klasse von Problemen mit sich, die innerhalb eines Prozesses nicht auftreten können: verlorene oder doppelte Nachrichten, Services, die langsam statt tot sind, Daten, die zwischen Kopien voneinander abweichen, und Ausfälle von Rechnern, von denen Sie gar nicht wussten, dass Sie von ihnen abhängen.
Die wichtigste Idee, die Sie mitnehmen sollten: Verteilung ist ein Tauschgeschäft, kein Upgrade. Jeder Nutzen wird mit Latenz, Konsistenz, Observability und Betriebsaufwand bezahlt, und eine gute Architektin oder ein guter Architekt kann sagen, welcher Nutzen gekauft wird, zu welchem Preis und warum eine günstigere Lösung innerhalb eines Monolithen nicht genügt. Die Fallacies of Distributed Computing und die Rechnung für synchrone Aufrufketten im ersten Abschnitt sind die Werkzeuge, um dieses Tauschgeschäft zu bewerten, bevor man sich darauf festlegt.
Wie die Abschnitte zusammenhängen
Das Kapitel geht vom Warum zum Wie. Abschnitt 6.1 legt die Gründe für eine Verteilung dar, die acht Trugschlüsse, den Teilausfall und die Kosten, und zeigt an einem ausgearbeiteten Beispiel, wie fünf Services mit jeweils 99,9 % Verfügbarkeit einen Anfragepfad von nur etwa 99,5 % ergeben. Zum Schluss greift er das Architekturquantum wieder auf, das erklärt, warum synchrone Aufrufe separat deployte Services aneinanderbinden.
Die nächsten drei Abschnitte behandeln die verteilten Hauptstile, jeweils wie die Stile in Kapitel 5: Definition und Herkunft, ein Diagramm, Funktionsweise, ein Beispiel, eine Tabelle der Merkmale, wann man den Stil einsetzt und die üblichen Anti-Patterns. Abschnitt 6.2 behandelt die servicebasierte Architektur, einen pragmatischen Mittelweg aus wenigen grobgranularen Domain Services, die sich oft eine Datenbank teilen, und die klassische serviceorientierte Architektur mit Enterprise Service Bus und kanonischen Modellen, einschließlich der Frage, warum sie in Ungnade fiel. Abschnitt 6.3 behandelt Microservices: an Bounded Contexts ausgerichtete Services, unabhängige Deploybarkeit, Datenbank pro Service, unterstützende Muster wie API-Gateways und Service Meshes, die Wahl der Granularität sowie den verteilten Monolithen und andere Anti-Patterns. Abschnitt 6.4 behandelt die ereignisgesteuerte Architektur: Ereignisse und Commands, Broker- und Mediator-Topologie, Partitionen und Consumer Groups in Kafka, Zustellgarantien und idempotente Consumer.
Die zweite Hälfte wendet sich den Mechanismen zu, auf die jeder verteilte Stil angewiesen ist. Abschnitt 6.5 vergleicht synchrone und asynchrone Kommunikation und die Kopplung, die jede erzeugt, und behandelt REST, gRPC, GraphQL und Messaging, Praktiken des API-Designs, Versionierung und Contract Testing. Abschnitt 6.6 handelt davon, was Leser replizierter Daten erwarten können: Konsistenzmodelle von der Linearisierbarkeit bis zur Eventual Consistency, das CAP-Theorem und was es wirklich besagt, PACELC und Quoren. Abschnitt 6.7 erklärt, warum Two-Phase Commit zwischen Services vermieden wird und wie Sagas, kompensierende Transaktionen und die Transactional Outbox Geschäftsprozesse auch ohne ihn korrekt halten. Abschnitt 6.8 schließt mit zwei Stilen für besondere Lastprofile: Serverless-Funktionen, die auf null skalieren und pro Aufruf abgerechnet werden, und Space-Based Architecture, die Daten im Arbeitsspeicher hält, um extreme Lastspitzen wie den Vorverkaufsstart von Tickets zu überstehen.
Durchgehende Beispiele und wie Sie das Kapitel lesen
Zwei Beispiele kehren immer wieder. Die Essenslieferplattform aus früheren Kapiteln (Kunden, Restaurants, Kuriere, Zahlungen) zeigt gewöhnliches verteiltes Design: Sie erscheint als fünf Domain Services, als Menge von Microservices, als Ereignisfluss OrderPlaced und als Bestell-Saga. Ein Ticketsystem, das Plätze für eine Stadiontournee verkauft, zeigt, was sich unter extremer, sprunghafter Last ändert, wenn Zehntausende Menschen in derselben Sekunde dieselben wenigen Plätze wollen.
Das Kapitel ist als „Mittelstufe bis Fortgeschritten“ eingestuft. Es setzt die Kapitel 0 bis 5 voraus, insbesondere Verfügbarkeit in Reihe und parallel (Kapitel 2), Kopplung und das Gesetz von Conway (Kapitel 3) sowie das Architekturquantum, den modularen Monolithen und Bounded Contexts (Kapitel 5). Einsteiger können zuerst die einleitende Zusammenfassung jedes Abschnitts und die Kästen „Wenn das neu für Sie ist“ lesen. Erfahrene Fachleute finden Präzision dort, wo es darauf ankommt: was eine At-least-once-Zustellung für jeden Consumer bedeutet, was „Exactly once“ bedeutet und was nicht, und warum Eventual Consistency bewusst eingeplant und nicht nur hingenommen werden muss.
Was Sie mitnehmen sollten
Drei Gewohnheiten ziehen sich durch jeden Abschnitt. Erstens: Zählen Sie synchrone Abhängigkeiten, nicht Services. Die Zahl der Dinge, die alle im selben Moment funktionieren müssen, damit die Anfrage eines Nutzers gelingt, bestimmt Verfügbarkeit und Latenz. Zweitens: Gehen Sie davon aus, dass Nachrichten verloren gehen, sich verzögern, doppelt ankommen und die Reihenfolge wechseln, und legen Sie Empfänger idempotent aus. Drittens: Legen Sie fest, wem jedes Datenstück gehört, denn die Datenhoheit entscheidet, wo Transaktionen möglich sind und wo Konsistenz über Services hinweg gesteuert werden muss. Kapitel 7 baut diese dritte Gewohnheit zu einer vollständigen Behandlung der Datenarchitektur aus.
Die 8 Abschnitte
Kapiteltest
Prüfen Sie Ihr Verständnis von Kapitel 6
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 6 in der App ablegenWeiterführende Literatur
- Fundamentals of Software Architecture (2nd edition), Mark Richards and Neal Ford (2025), O'Reilly Media. Klare Kapitel über servicebasierte, ereignisgesteuerte, Space-Based- und Microservice-Stile mit Bewertungen der Merkmale sowie die erweiterte Liste der Trugschlüsse verteilter Systeme.
- Software Architecture: The Hard Parts, Neal Ford, Mark Richards, Pramod Sadalage and Zhamak Dehghani (2021), O'Reilly Media. Analyse von Abwägungen für verteilte Systeme: Architekturquanten, Service-Granularität (Disintegratoren und Integratoren), Datenhoheit und verteilte Abläufe.
- Building Microservices (2nd edition), Sam Newman (2021), O'Reilly Media. Der Standardleitfaden für die Praxis zu Microservices, aufgebaut um die unabhängige Deploybarkeit, mit ausgewogenem Rat dazu, wann man sie nicht einsetzen sollte.
- Microservices, James Lewis and Martin Fowler (2014), martinfowler.com. Der Artikel, der den Begriff für den Großteil der Branche definiert hat, mit seinen neun gemeinsamen Merkmalen.
- Enterprise Integration Patterns: Designing, Building, and Deploying Messaging Solutions, Gregor Hohpe and Bobby Woolf (2003), Addison-Wesley. Das Vokabular des Messaging (Kanäle, Event- und Command-Nachrichten, idempotente Empfänger, Dead-Letter-Kanäle), das jedes ereignisgesteuerte Design bis heute verwendet.
- Designing Data-Intensive Applications (2nd edition), Martin Kleppmann and Chris Riccomini (2026), O'Reilly Media. Die beste Erklärung von Replikation, Konsistenz, Logs, Stream-Verarbeitung und den Tücken verteilter Systeme.
- Building Event-Driven Microservices (2nd edition), Adam Bellemare (2025), O'Reilly Media. Event-Streams als Rückgrat einer Service-Architektur: Event-Design, Schemas, Datenhoheit und Stream-Verarbeitung.