Read in English · Leer en español · Lire en français
Abschnitt 5.1 von 5.8 · Mittelstufe · 22 Min. Lesezeit
Architekturstile, Muster und Taktiken
Videolektion
5 Min. · auf Englisch gesprochen, mit UntertitelnNur anhören (Audio)
Transkript lesen
In dieser Lektion lernen Sie das Vokabular, auf das die Kapitel fünf und sechs aufbauen: was ein Stil ist, wie er sich von einem Muster und einer Taktik unterscheidet und wie man die wirklich unabhängigen Teile eines Systems zählt.
Denken Sie an Haustypen: ein Reihenhaus, ein Bungalow, ein Hochhaus. Jeder Name verrät einem Bauunternehmen viel, bevor es eine Zeichnung gibt: wie viele Stockwerke, wie die Räume verbunden sind, was es kostet und wo es gut funktioniert. Software hat ihre eigenen benannten Formen, die Architekturstile: eine Anwendung in Schichten, Module in einem Programm, eine Kette von Verarbeitungsschritten, eine Gruppe getrennter Services. Wer sie kennt und weiß, was jeder gut und schlecht kann, kann als Team schnell eine sinnvolle Form wählen und sie in wenigen Worten beschreiben.
David Garlan und Mary Shaw beschrieben einen Architekturstil als Vokabular von Komponenten- und Konnektortypen, zusammen mit Randbedingungen dafür, wie sie kombiniert werden dürfen. Pipes and Filters verbietet zum Beispiel, dass Filter Zustand teilen oder ihre Nachbarn kennen. Halten Sie sich an diese Regel, und Sie erhalten Filter, die sich einzeln testen, wiederverwenden und neu anordnen lassen. Das ist kein Glück, sondern eine Folge der Regel. Ein Stil ist also kein Bild zum Abzeichnen. Er ist ein Satz von Regeln, die bestimmte Qualitäten einbringen, zu einem Preis. Übernehmen Sie das Vokabular ohne die Regeln, und Sie zahlen den Preis ohne den Nutzen.
Vier verwandte Begriffe werden oft locker verwendet. Ein Stil beschreibt die Gesamtform: welche Teile und Verbindungen erlaubt sind und nach welchen Regeln. Ein Muster ist eine bewährte Lösung für ein wiederkehrendes Strukturproblem in einem bestimmten Kontext, etwa Broker oder Model View Controller. Eine Taktik ist kleiner: eine Entwurfsentscheidung, die ein Qualitätsmerkmal bewegt, etwa ein Cache, um die Latenz zu senken. Muster bündeln meist mehrere Taktiken. Und eine Referenzarchitektur ist eine Vorlage für eine ganze Domäne, etwa AUTOSAR für die Elektronik in Autos. Fachleute sind uneins, wo der Stil endet und das Muster beginnt; stecken Sie Ihre Energie lieber in die Randbedingungen.
Die erste große Entscheidung ist, wie das System auf oberster Ebene aufgeteilt wird. Technische Partitionierung gruppiert Code nach technischer Rolle: Präsentation, Geschäftslogik und Persistenz. Angenommen, ein Essenslieferunternehmen lässt Kunden dem Kurier Trinkgeld geben. Das braucht ein neues Feld auf einer Bildschirmmaske, eine neue Regel und eine neue Datenbankspalte. Eine Änderung betrifft jede Schicht. Fachliche Partitionierung gruppiert Code stattdessen nach Geschäftsfähigkeit: Bestellungen, Zahlung, Lieferung und Speisekarten, jeweils mit eigener Oberfläche, Logik und Daten. Hier landet dieselbe Änderung fast vollständig im Liefermodul. Die meisten fachlichen Änderungen sind in Begriffen der Domäne formuliert, daher hält fachliche Partitionierung sie meist an einem Ort. Technische Partitionierung ist einfacher und passt zu kleinen Systemen, die ein Team baut.
Die zweite Unterscheidung ist das Deployment. Ein Monolith wird als eine Einheit deployt. Ein verteiltes System besteht aus mehreren Einheiten, die über ein Netzwerk zusammenarbeiten, mit allen Kosten des Netzwerks. Eine schärfere Idee ist das Architekturquantum. Ein Quantum ist ein Teil, der unabhängig deployt werden kann, eine zusammenhängende fachliche Aufgabe erledigt und alles enthält, was er braucht, insbesondere seine Datenbank. Ein Monolith ist per Definition ein Quantum. Drei Services, die sich eine Datenbank teilen, sind immer noch ein Quantum. Keiner kann das Schema ändern oder allein wiederhergestellt werden, also stehen und fallen sie gemeinsam. Erst wenn jeder Service seine Daten besitzt und sie Events austauschen, erhalten Sie drei Quanten. Das ist wichtig, weil Architekturmerkmale pro Quantum gelten. Teile mit sehr unterschiedlichen Anforderungen müssen getrennte Quanten sein.
Ordnen wir vier Entwürfe für die Essenslieferplattform ein. Entwurf eins ist eine einzige Anwendung mit Ordnern für Views, Services und Models. Technische Partitionierung, eine Einheit, ein Quantum. Jedes Feature durchquert alle drei Ordner. Entwurf zwei hat Pakete für Bestellungen, Zahlungen, Lieferung und Speisekarten, jedes mit eigenen Tabellen. Immer noch ein Quantum, aber Änderungen bleiben lokal, und die Module ließen sich später trennen. Entwurf drei macht daraus vier Services, die sich dieselben Tabellen teilen. Vier Deployment-Einheiten, aber ein Quantum: Eine Schemaänderung oder ein Datenbankausfall trifft alle vier. Alle Kosten der Verteilung, kaum ihre Vorteile. Entwurf vier gibt jedem Service eine eigene Datenbank. Jetzt gibt es vier Quanten, jedes eigenständig released, um den Preis von Netzwerkfehlern und Eventual Consistency.
Nehmen Sie drei Punkte mit. Monolith beschreibt das Deployment, nicht die Qualität. Teilen Sie einen Big Ball of Mud in Services auf, und Sie erhalten einen verteilten Big Ball of Mud, und der ist schlimmer. Reale Systeme sind Mischformen. Ein modularer Monolith kann innerhalb jedes Moduls in Schichten aufgebaut sein und einen nächtlichen Pipes-and-Filters-Job ausführen. Und ein Stil ist kein Ziel an sich. Gehen Sie von Ihren architekturrelevanten Anforderungen aus, wählen Sie den einfachsten Stil, der sie erfüllt, halten Sie die Wahl fest und setzen Sie seine Regeln durch.
Der vollständige Abschnitt enthält eine Tabelle aller Stile der Kapitel fünf und sechs und mehr zu Quanten. Als Nächstes sehen wir uns in Abschnitt fünf Punkt zwei den vertrautesten Stil von allen an: die Schichtenarchitektur. Bis gleich.
Was Sie wissen müssen
- Ein Architekturstil ist ein benannter Satz von Elementtypen, Konnektortypen und Randbedingungen dafür, wie sie kombiniert werden (Garlan und Shaw); die Randbedingungen geben einem Stil seine vorhersagbaren Qualitäten.
- Ein Architekturmuster in der Tradition von Pattern-Oriented Software Architecture (Buschmann et al., 1996) ist eine bewährte Lösung für ein wiederkehrendes Strukturproblem in einem bestimmten Kontext; eine Taktik ist eine einzelne Entwurfsentscheidung, die auf ein Qualitätsmerkmal zielt; eine Referenzarchitektur ist eine Vorlage für eine Domäne.
- Technische Partitionierung teilt ein System nach technischer Rolle auf (Präsentation, Logik, Daten); fachliche Partitionierung teilt es nach Geschäftsfähigkeit auf (Bestellungen, Zahlungen, Lieferung). Die Wahl entscheidet, wie weit sich eine typische Feature-Änderung ausbreitet und wie sich Teams organisieren lassen.
- Ein monolithischer Stil wird als eine Einheit deployt; ein verteilter Stil wird als mehrere Einheiten deployt, die über ein Netzwerk zusammenarbeiten, und erbt alle Kosten des Netzwerks.
- Ein Architekturquantum ist ein unabhängig deploybarer Teil mit hoher funktionaler Kohäsion, Daten eingeschlossen; pro Quantum gilt ein Satz von Architekturmerkmalen, deshalb müssen Teile mit sehr unterschiedlichen Anforderungen getrennte Quanten sein.
- Jeder Stil ist eine Abwägung mit typischen Stärken und Schwächen; reale Systeme kombinieren Stile, und die Bewertungen in diesem Kurs sind relative Einschätzungen für typische Umsetzungen, keine Gesetze.
Warum Architekten Formen benennen
Die meisten Systeme werden nicht aus dem Nichts entworfen. Erfahrene Architekten erkennen, dass ein neues Problem einem bereits bekannten ähnelt, und greifen zu einer Form, die sich bewährt hat: ein paar Schichten für eine unkomplizierte Geschäftsanwendung, eine Kette von Verarbeitungsschritten für einen Datenfeed, ein Kern mit Plug-ins für ein Produkt, das Kunden erweitern. Diese Formen zu benennen gibt einem Team ein gemeinsames Vokabular. Der Satz es ist ein modularer Monolith mit ereignisbasierter Kommunikation zwischen den Modulen
vermittelt in wenigen Worten, wofür sonst eine Seite voller Diagramme nötig wäre, und er bringt ein ganzes Wissen darüber mit, was typischerweise gut und was schiefgeht.
David Garlan und Mary Shaw stellten dies in An Introduction to Software Architecture (technischer Bericht der Carnegie Mellon University, 1994) und in ihrem Buch Software Architecture: Perspectives on an Emerging Discipline (1996) auf ein solides Fundament. Sie beschrieben einen Architekturstil als Vokabular von Komponenten- und Konnektortypen zusammen mit einem Satz von Randbedingungen dafür, wie sie kombiniert werden dürfen. Pipes and Filters hat zum Beispiel eine Art von Komponente (einen Filter, der Daten umwandelt) und eine Art von Konnektor (eine Pipe, die sie in eine Richtung transportiert), und es verlangt, dass Filter keinen Zustand teilen und ihre Nachbarn nicht kennen. Roy Fielding, dessen Dissertation (2000) REST als Stil definierte, brachte es noch schärfer auf den Punkt: Ein Stil ist ein abgestimmter Satz von Randbedingungen, und die Randbedingungen erzeugen die Eigenschaften. Verbieten Sie Filtern, Zustand zu teilen, und Sie erhalten Filter, die sich unabhängig testen, wiederverwenden und neu anordnen lassen; das ist kein Glück, sondern eine Folge der Regel.
So liest man jeden Stil in diesem und im nächsten Kapitel am besten. Ein Stil ist kein Bild zum Abzeichnen. Er ist ein Satz von Regeln, denen man zu folgen zustimmt, gewählt, weil ihre Einhaltung bestimmte Architekturmerkmale einbringt, die Qualitätsmerkmale aus Kapitel 2, zu einem Preis. Ein Team, das das Vokabular eines Stils übernimmt, aber nicht seine Regeln, zahlt den Preis ohne den Nutzen.
Stile, Muster, Taktiken und Referenzarchitekturen
Für wiederverwendbares Entwurfswissen werden vier verwandte Begriffe verwendet, oft recht locker. Sie unterscheiden sich vor allem in ihrer Reichweite und darin, wie viel sie vorschreiben.
Ein Architekturmuster beschreibt eine bewährte Lösung für ein wiederkehrendes Strukturproblem in einem bestimmten Kontext. Die Idee der Muster stammt vom Gebäudearchitekten Christopher Alexander und kam über die Entwurfsmuster von Gamma, Helm, Johnson und Vlissides (1994), die auf der Ebene weniger Klassen arbeiten, in die Software. Pattern-Oriented Software Architecture, Volume 1: A System of Patterns von Frank Buschmann, Regine Meunier, Hans Rohnert, Peter Sommerlad und Michael Stal (1996), meist POSA genannt, katalogisierte Muster auf der Ebene ganzer Systeme: Layers, Pipes and Filters und Blackboard (gruppiert als Weg vom Chaos zur Struktur, „From Mud to Structure“), Broker für verteilte Systeme, Model-View-Controller und Presentation-Abstraction-Control für interaktive Systeme sowie Microkernel und Reflection für anpassbare Systeme. Jedes POSA-Muster ist als Kontext, Problem, Kräfte und Lösung mit Konsequenzen beschrieben, was die Abwägungen explizit macht.
Eine Taktik im Sinne von Len Bass, Paul Clements und Rick Kazman in Software Architecture in Practice ist kleiner: eine Entwurfsentscheidung, die eine Reaktion eines Qualitätsmerkmals beeinflusst, etwa ein Heartbeat, um einen ausgefallenen Server zu erkennen, oder ein Cache, um die Latenz zu senken. Abschnitt 2.6 verwendete Änderbarkeitstaktiken wie Kapselung und den Einsatz eines Vermittlers. Muster bündeln mehrere Taktiken: Das Layers-Muster kombiniert Kapselung, eingeschränkte Abhängigkeiten und den Einsatz eines Vermittlers.
Eine Referenzarchitektur ist eine Vorlage für eine ganze Domäne oder Plattform: Sie benennt die typischen Bausteine und wie sie verbunden sind, sodass Projekte sie anpassen, statt mit einem leeren Blatt zu beginnen. AUTOSAR, die geschichtete Softwarearchitektur für Steuergeräte in Autos, ist ein bekanntes Beispiel; die Architecture Center der Cloud-Anbieter bieten viele kleinere. Eine Referenzarchitektur besteht meist aus mehreren Stilen und Mustern zugleich.
Fachleute sind sich nicht einig, wo die Grenze zwischen Stil und Muster verläuft. POSA nennt Layers ein Muster; Garlan und Shaw nennen Schichtensysteme einen Stil; Mark Richards und Neal Ford reservieren in Fundamentals of Software Architecture Stil
für die Gesamttopologie eines Systems und Muster
für wiederverwendbare Strukturen auf tieferer Ebene, die in vielen Stilen vorkommen können. Dieser Kurs folgt dem üblichen Sprachgebrauch: Stil für die Gesamtform eines Systems oder eines großen Teils davon, Muster für eine wiederverwendbare Lösung, die auf jeder Ebene sitzen kann. Verwenden Sie keine Energie auf die Grenze; verwenden Sie sie auf die Randbedingungen und ihre Folgen.
Vier Arten wiederverwendbaren Entwurfswissens
| Begriff | Bereich | Beispiel | Beantwortete Frage |
|---|---|---|---|
| Architekturstil | Ganzes System oder ein großer Teil | Schichten, Pipes and Filters, Microservices | Welche Arten von Teilen und Verbindungen sind erlaubt, und nach welchen Regeln? |
| Architekturmuster | Jede Strukturebene | Broker, Model-View-Controller, Microkernel | Was ist eine bewährte Lösung für dieses wiederkehrende Strukturproblem, und was kostet sie? |
| Taktik | Eine Entwurfsentscheidung | Heartbeat, Cache, Kapselung, Wiederholung mit Back-off | Welche einzelne Entscheidung bewegt dieses Qualitätsmerkmal in die Richtung, die wir brauchen? |
| Referenzarchitektur | Eine Domäne oder Plattform | AUTOSAR für Fahrzeugelektronik; veröffentlichte Architekturen der Cloud-Anbieter | Was enthalten Systeme dieser Art üblicherweise, und wie ist es üblicherweise angeordnet? |
Zwei Arten, ein System zu schneiden: technische oder fachliche Partitionierung
Die erste Strukturentscheidung in jedem Stil ist, wie das System auf oberster Ebene aufgeteilt wird. Es gibt zwei grundlegende Antworten. Technische Partitionierung gruppiert Code nach technischer Rolle: alles zur Benutzeroberfläche an einem Ort, alle Geschäftsregeln an einem anderen, der gesamte Datenbankzugriff an einem dritten. Fachliche Partitionierung gruppiert Code nach Geschäftsfähigkeit: alles zu Bestellungen an einem Ort, Zahlungen an einem anderen, Lieferung an einem dritten, jeweils mit der Benutzeroberfläche, Logik und dem Datenzugriff, die dafür nötig sind.
Der Unterschied zeigt sich, sobald sich ein Feature ändert. Angenommen, ein Essenslieferunternehmen lässt Kunden ein Trinkgeld für den Kurier hinzufügen. In einem technisch partitionierten System braucht diese Änderung ein neues Feld auf einer Bildschirmmaske (Präsentation), eine neue Regel für Trinkgeldgrenzen und Auszahlungen (Geschäftslogik) sowie eine neue Spalte und Abfrage (Persistenz): drei Teile, oft im Besitz von drei verschiedenen Personen oder Teams. In einem fachlich partitionierten System landet dieselbe Änderung fast vollständig im Liefermodul. Die meisten fachlichen Änderungswünsche sind in Begriffen der Domäne formuliert, daher hält fachliche Partitionierung eine Änderung meist an einem Ort. Technische Partitionierung hält eine technische Änderung an einem Ort, etwa den Austausch der Datenbankzugriffsbibliothek, aber solche Änderungen sind seltener.
Die Wahl prägt auch die Organisation. Nach dem Gesetz von Conway wird ein technisch partitioniertes System meist von einem Frontend-Team, einem Backend-Team und einem Datenbankteam gebaut, und jedes Feature braucht eine Übergabe zwischen ihnen. Ein fachlich partitioniertes System kann von Teams gebaut werden, die jeweils eine Geschäftsfähigkeit durchgängig verantworten. Martin Fowler gab 2015 dieselbe Empfehlung: Präsentations-, Domänen- und Datenschicht sind eine gute Art, ein kleines Stück Software zu organisieren, aber die oberste Ebene eines größeren Systems sollte in domänenorientierte Module aufgeteilt werden, jedes intern in Schichten, wenn das hilft.
Keines von beiden ist falsch. Technische Partitionierung ist einfach, vertraut und wird von der Standard-Ordnerstruktur fast jedes Web-Frameworks unterstützt, und sie passt zu kleinen Systemen, in denen ein Team alles macht. Fachliche Partitionierung erfordert vorab mehr Überlegung, weil jemand gute Domänengrenzen finden muss (das Thema von Abschnitt 5.7), aber sie skaliert besser mit der Größe des Systems und der Zahl der Teams.
Dasselbe Feature bei zwei Partitionierungen
Monolithische und verteilte Stile
Die zweite grundlegende Unterscheidung betrifft das Deployment. Eine Deployment-Einheit ist das, was als ein Stück gebaut, released und gestartet wird: eine einzelne ausführbare Datei, ein Container-Image, ein Webarchiv. In einer monolithischen Architektur ist die ganze Anwendung eine Deployment-Einheit, meist mit einer Datenbank. Sie kann als viele identische Kopien hinter einem Load Balancer laufen, aber jede Kopie enthält den gesamten Code, und jede Änderung auszuliefern heißt, alles auszuliefern. In einer verteilten Architektur besteht das System aus mehreren Deployment-Einheiten, die zusammenarbeiten, indem sie Nachrichten über ein Netzwerk senden, und jede kann separat released und skaliert werden.
Zwei Klarstellungen vermeiden viel Verwirrung. Erstens beschreibt Monolith
das Deployment, nicht die Qualität. Ein Monolith kann wunderbar modular sein oder ein Big Ball of Mud (der Name, den Brian Foote und Joseph Yoder einem System ohne erkennbare Struktur gaben), und dasselbe gilt für ein verteiltes System: Viele Teams haben gelernt, dass die Aufteilung eines Big Ball of Mud in Services einen verteilten Big Ball of Mud ergibt, und der ist schlimmer. Zweitens ist Verteilung kein kostenloses Upgrade. Jeder Aufruf über ein Netzwerk kann langsam sein, auf halbem Weg scheitern oder doppelt ankommen, Daten lassen sich nicht mehr in einer lokalen Transaktion ändern, und das System braucht Monitoring, Deployment-Automatisierung und Rufbereitschaftskompetenz, ohne die ein Monolith auskommt. Kapitel 6 behandelt diese Kosten im Detail. Dieses Kapitel behandelt die Stile, die sie vermeiden: Alles läuft in einer Deployment-Einheit, und die Architektur steckt darin, wie der Code darin organisiert ist.
Das Architekturquantum
Monolithisch und verteilt ist ein nützlicher erster Schnitt, aber zu grob für echte Entscheidungen. Neal Ford, Rebecca Parsons und Patrick Kua führten in Building Evolutionary Architectures (2017) eine schärfere Idee ein, die Ford, Richards, Sadalage und Dehghani in Software Architecture: The Hard Parts (2021) verfeinerten: das Architekturquantum. Ein Quantum ist ein Teil des Systems, der unabhängig deployt werden kann, hohe funktionale Kohäsion hat (er erledigt eine zusammenhängende Aufgabe für das Geschäft) und alles enthält, was er zum Funktionieren braucht, insbesondere seine Datenbank. Die spätere Definition ergänzt, dass die Teile eines Quantums statisch gekoppelt sind (sie teilen Code, Schemas oder Infrastruktur, die gemeinsam deployt werden müssen) und dass synchrone Aufrufe Quanten für die Dauer des Aufrufs betrieblich aneinander binden.
Warum ist das wichtig? Weil Architekturmerkmale pro Quantum gelten. Ein Quantum wird als Ganzes skaliert, deployt, abgesichert und wiederhergestellt, also hat es ein Niveau an Skalierbarkeit, ein Niveau an Verfügbarkeit, einen Release-Rhythmus. Brauchen zwei Teile eines Systems sehr unterschiedliche Merkmale, etwa ein Kurier-Standortfeed, der Tausende Aktualisierungen pro Sekunde verkraften muss, und ein monatlicher Rechnungslauf für Restaurants, dann bekommen sie diese nur, wenn sie in verschiedenen Quanten liegen. Umgekehrt entstehen durch die Aufteilung von Code in mehrere Services keine mehreren Quanten, wenn sie sich weiterhin eine Datenbank teilen: Keiner von ihnen kann das Schema ändern oder allein wiederhergestellt werden, also stehen und fallen sie gemeinsam. Ein Monolith ist per Definition ein Quantum.
Quanten zählen
Ausgearbeitetes Beispiel
Ausgearbeitetes Beispiel: vier Entwürfe einordnen
Ein Essenslieferunternehmen prüft vier Entwurfskandidaten für seine Plattform. Für jeden stellt die Architektin drei Fragen: Wie ist die oberste Ebene partitioniert, wie viele Deployment-Einheiten gibt es, und wie viele Quanten?
Entwurf 1: eine Django-Anwendung mit den Ordnern views, services und models, eine PostgreSQL-Datenbank | Technische Partitionierung; eine Deployment-Einheit; ein Quantum. Einfach, aber jedes Feature durchquert alle drei Ordner. |
|---|---|
Entwurf 2: eine Anwendung mit den Paketen orders, payments, delivery und menus, jedes mit eigenen Tabellen, ein Datenbankserver | Fachliche Partitionierung; eine Deployment-Einheit; ein Quantum. Änderungen bleiben lokal, und die Module ließen sich später trennen. |
| Entwurf 3: vier Services (Bestellungen, Zahlungen, Lieferung, Speisekarten), die alle dieselben Datenbanktabellen lesen und schreiben | Fachliche Partitionierung dem Namen nach; vier Deployment-Einheiten, aber ein Quantum, weil eine Schemaänderung oder ein Datenbankausfall alle vier betrifft. Alle Kosten der Verteilung, kaum ihre Vorteile. |
| Entwurf 4: dieselben vier Services, jeder mit eigener Datenbank, die Events über einen Message Broker austauschen | Fachliche Partitionierung; vier Deployment-Einheiten; vier Quanten. Jeder lässt sich unabhängig skalieren und releasen, um den Preis von Netzwerkfehlern und Eventual Consistency zwischen ihnen. |
Die Entwürfe 1 und 2 kosten im Betrieb gleich viel, aber Entwurf 2 macht typische Änderungen billiger und hält künftige Optionen offen.
Entwurf 3 ist der Warnfall: Die Zahl der Deployment-Einheiten sagt wenig; die Zahl der Quanten, die von Daten und Kopplung abhängt, sagt, was sich wirklich unabhängig weiterentwickeln kann.
Wie Sie die folgenden Stilabschnitte lesen
Die Abschnitte 5.2 bis 5.5 und der größte Teil von Kapitel 6 beschreiben jeweils einen Stil, immer in derselben Reihenfolge, damit sich die Stile vergleichen lassen: eine Definition und die Herkunft des Stils; ein Diagramm; die Funktionsweise; ein konkretes Beispielsystem; eine Tabelle, die seine wichtigsten Merkmale bewertet; wann man ihn einsetzt und wann nicht; häufige Anti-Patterns; und wie man ihn im Code durchsetzt, denn ein Stil, der nicht geprüft wird, erodiert, wie Abschnitt 1.7 beschrieben hat.
Die Merkmalsbewertungen (Niedrig, Mittel, Hoch, jeweils mit Begründung) folgen dem Ansatz der Stilvergleiche von Richards und Ford, sind aber die eigenen Einschätzungen dieses Kurses. Lesen Sie sie als relativ und typisch: Sie vergleichen Stile so, wie sie üblicherweise gebaut werden, von einem kompetenten Team, für ein typisches Geschäftssystem. Ein diszipliniertes Team kann einen Schichtenmonolithen bauen, der viele Male am Tag deployt wird, und ein nachlässiges Microservices, die sich überhaupt nicht deployen lassen. Die Bewertungen zeigen Ihnen, wo der Stil hilft und wo Sie gegen ihn arbeiten müssen.
Zwei Abschnitte in diesem Kapitel behandeln keine Deployment-Stile. Hexagonale, Onion- und Clean Architecture (Abschnitt 5.6) beschreiben, wie man das Innere einer Anwendung oder eines Service so organisiert, dass die Geschäftslogik nicht von der Technologie abhängt. Domain-Driven Design (Abschnitt 5.7) ist ein Weg, die Domänengrenzen zu finden, auf die modulare Monolithen und Microservices angewiesen sind. Beide gelten gleichermaßen innerhalb eines Monolithen wie eines verteilten Systems.
Die Stile der Kapitel 5 und 6 auf einen Blick
| Stil | Hauptpartitionierung | Deployment | Typischer Einsatz |
|---|---|---|---|
| Schichten (5.2) | Technisch | Monolithisch | Kleine bis mittlere Geschäftsanwendungen, gebaut von einem Team |
| Modularer Monolith (5.3) | Fachlich | Monolithisch | Wachsende Produkte mit mehreren Teams, die ein Deployment wollen |
| Pipes and Filters (5.4) | Technisch (Verarbeitungsschritte) | Monolithisch oder verteilt | Datenverarbeitung: ETL, Medien, Logs, Compiler |
| Microkernel (5.5) | Technischer Kern, Plug-ins oft fachlich | Meist monolithisch | Produkte, die Kunden oder Dritte erweitern; Regel-Engines |
| Hexagonal, Onion, Clean (5.6) | Innere Struktur: Domäne im Zentrum | Beides | Jede Anwendung, deren Logik ihre Frameworks überdauern muss |
| Servicebasiert (6.2) | Fachlich | Verteilt, wenige grobe Services | Ein pragmatischer Schritt über den Monolithen hinaus, oft mit gemeinsamer Datenbank |
| Serviceorientierte Architektur (6.2) | Technisch (Orchestrierung, Enterprise-Services) | Verteilt | Unternehmensintegration, heute weitgehend historisch |
| Microservices (6.3) | Fachlich | Verteilt, viele feingranulare Services | Viele Teams, die im großen Maßstab unabhängig releasen müssen |
| Ereignisgesteuert (6.4) | Technisch (Ereignisverarbeitung) | Verteilt | Hochreaktive, entkoppelte Reaktionen auf Geschäftsereignisse |
| Serverless und Space-Based (6.8) | Unterschiedlich | Verteilt | Spitzenlasten oder extreme Last; Pay-per-Use-Workloads |
Stile lassen sich kombinieren, und sie sind keine Ziele
Reale Systeme sind Mischformen. Ein modularer Monolith kann innerhalb jedes Moduls in Schichten aufgebaut sein; eines seiner Module kann einen nächtlichen Pipes-and-Filters-Job ausführen; ein Microservice kann im hexagonalen Stil gebaut sein; ein ereignisgesteuertes System kann einen Microkernel nutzen, damit Kunden eigene Regeln hinzufügen können. Den Stil jedes Teils zu benennen ist trotzdem nützlich, weil jeder Teil dann einen bekannten Satz von Regeln und Abwägungen erbt.
Der häufige Fehler ist, einen Stil als Ziel an sich zu behandeln: Wir stellen auf Microservices um
als Strategie statt als Mittel zu einer benannten Qualität wie unabhängigem Deployment für zwölf Teams. Gehen Sie von den architekturrelevanten Anforderungen aus Kapitel 2 aus, wählen Sie den einfachsten Stil, dessen Merkmale sie erfüllen, halten Sie die Wahl als Entscheidungsdokument fest und setzen Sie seine Regeln durch. Abschnitt 5.8 bietet eine Entscheidungshilfe für die Stile in diesem Kapitel.
Prüfen Sie Ihr Verständnis
Welche zwei Dinge definieren laut Garlan und Shaw einen Architekturstil?
Ein Vokabular von Komponenten- und Konnektortypen und ein Satz von Randbedingungen dafür, wie sie kombiniert werden dürfen. Die Randbedingungen erzeugen die typischen Qualitäten des Stils.
Was ist der Unterschied zwischen einer Taktik und einem Muster?
Eine Taktik ist eine Entwurfsentscheidung, die auf eine Reaktion eines Qualitätsmerkmals zielt, etwa ein Heartbeat oder ein Cache. Ein Muster ist eine größere, dokumentierte Lösung, die typischerweise mehrere Taktiken kombiniert.
Warum können vier Services, die sich eine Datenbank teilen, als ein einziges Architekturquantum zählen?
Weil keiner von ihnen das gemeinsame Schema ändern, wiederhergestellt oder auf Datenebene skaliert werden kann, ohne die anderen zu beeinflussen; in der Praxis werden sie gemeinsam deployt und fallen gemeinsam aus, also teilen sie einen Satz betrieblicher Merkmale.
Welche Art von Änderung hält technische Partitionierung an einem Ort?
Eine technische Änderung, etwa den Austausch der Datenbankzugriffsbibliothek oder des UI-Frameworks. Typische fachliche Änderungen ziehen sich dagegen durch alle technischen Schichten.
Quellen und weiterführende Literatur
Haben Sie eine Frage zu diesem Abschnitt? ArchitectBot, der KI-Lernassistent des Kurses, antwortet zuerst aus dem Kurs.
Fragen: „Unsere vier Services nutzen alle dieselbe PostgreSQL-Datenbank. Ist das wirklich ein Problem oder nur ein theoretisches?“