CQRS
CQRS trennt Modelle zum Ändern von Zustand von Modellen zum Lesen. Beide Seiten dürfen ihrer Aufgabe entsprechend gestaltet sein.
- Command und QueryBefehl ändert, Abfrage liest nur.
- ProjektionÜberträgt Änderungen in die Leseansicht.
- Nachlaufende LeseansichtZeigt neue Stände erst später.
Einordnung
Warum das wichtig ist
Ein Universalmodell trägt strenge Schreibregeln und bequeme Übersichten schlecht zugleich. Bertrand Meyer trennte Befehle und Abfragen als CQS; Greg Young prägte CQRS. CQRS beginnt klein, schon mit getrennten Methoden. Die Historie als Speicherform ist ein eigener Baustein, Event Sourcing.
Dieser Baustein erklärt getrennte Schreib- und Lesemodelle. Für eine vollständige Ereignishistorie als Speicherform siehe Event Sourcing.
Auf einen Blick · Schreib- und Lesepfad getrennt
Wie weit trennst du?
Bestellung prüft Statusübergänge im Schreibmodell. Der Kundenservice liest eine flache Übersicht mit Zahlung, Versand und Rechnungsnummer.
So liest du das Bild
- Command und Query In jeder Stufe die Bahn „Ändern“ mit Befehl und die Bahn „Lesen“ mit Abfrage.
- Projektion Stufe 3: Kasten „Projektion“ zwischen Schreibmodell und Lesespeicher.
- Nachlaufende Leseansicht Nach dem Befehl: Kundenservice zeigt „bezahlt“, Schreibmodell „versendet“.
Ein Modell, aber Befehle und Abfragen sind getrennte Methoden.
Ändern
- Befehl
- Bestellmodell
- Datenbank
Lesen
- Abfrage
- Bestellmodell
- Datenbank
- Zusätzliche Teile
- keine
- Verzögerung
- keine
- Leseform
- Leseform passt teils
Dieselbe Bestellung B-1042 in zwei Modellen
| Feld | Schreibmodell Bestellung | Leseansicht Kundenservice |
|---|---|---|
| Identität | B-1042 | B-1042 mit Kundenname |
| Positionen | P-7, Menge 2, vereinbarter Preis, Regeln | kurze Liste: 2 × Tasse, 49,90 € |
| Status | erlaubte Übergänge, z. B. bestätigt | lesbarer Gesamtstatus |
| Zahlung und Versand | nur Referenzen, z. B. P-731 | zusammengeführte Status, Rechnungsnummer |
| Änderung | Befehl mit Validierung | keine fachliche Änderung |
| Aktualisierung | wird sofort geschrieben | folgt dem Schreibmodell nach einer Weile |
Nutzen & Grenzen
Hilft, wenn
- Unterschiedliche Anforderungen an Schreibregeln und Abfrageformen lassen sich mit getrennten Modellen gezielt ausdrücken.
- Getrennt gemessene Lese- und Schreiblasten können mit passenden Modellen unabhängig optimiert werden.
- Ein Lesemodell verbindet Informationen für Abfragen, während die Schreibinvariante im Änderungsmodell bleibt.
Grenzen
- Bei einfachen Abfragen bedeuten zwei Modelle doppelte Pflege; beginne mit Stufe 1.
- Die Leseansicht kann veraltet sein; verbindliche Entscheidungen wie eine Stornierung liest man vom Schreibmodell. Mehr dazu unter Konsistenz.
- Projektionen müssen sich neu aufbauen lassen; teste Wiederaufbau und Abgleich.
In der Praxis
- Trenne Command- und Query-Verträge nach ihrer Wirkung. Commands prüfen Regeln und ändern Zustand; Queries lesen eine zugeschnittene Sicht und erhalten keine Schreibverantwortung.
- Führe getrennte Modelle schrittweise ein und miss, welcher konkrete Zugriff davon profitiert. Ein eigener Speicher bleibt eine zusätzliche Betriebsentscheidung; CQRS lässt sich auch mit gemeinsamer Speicherung umsetzen.
- Zeige Aktualität einer Projektion und mache ihren Wiederaufbau prüfbar. Event Sourcing entscheidet über Historienhaltung; Konsistenzmodelle beschreiben Sichtbarkeit.
Ausführliche Erklärung lesen
Ein Command fordert eine Zustandsänderung an und wird gegen fachliche Regeln geprüft. Eine Query liest Informationen, ohne den Zustand zu verändern. CQRS trennt diese Verantwortungen und erlaubt Modellen, jeweils die Form ihrer Aufgabe auszudrücken.
Die Trennung kann in einem Modul und einer Datenbank beginnen. Eine Projektion oder ein separater Speicher ist eine zusätzliche Wahl, die eigene Aktualisierungs- und Wiederaufbauregeln verlangt. Lesemodelle können dem Schreibmodell zeitlich nachlaufen; diese Aktualität gehört zur sichtbaren Zusage.
Event Sourcing verändert die Schreibseite zur Ereignishistorie; CQRS kann dagegen getrennte Lese- und Schreibmodelle mit gewöhnlicher Zustandsablage verwenden. Konsistenzmodelle beschreiben die Aktualität der Lesesicht.
Selbst prüfen
Teste dich in drei Stufen
AblesenIm Bild nachsehen
Stufe 3, Befehl ausgelöst, Projektion noch nicht gelaufen: Was zeigen Schreibmodell und Leseansicht Kundenservice für B-1042?
Lösung mit Begründung ansehen
Das Schreibmodell zeigt „versendet“, die Leseansicht noch „bezahlt“. Sie ist veraltet, bis die Projektion durchgelaufen ist.
AnwendenAuf eine neue Lage übertragen
Der Kundenservice will die Rechnungsnummer in der Übersicht sehen. Welche Seite ergänzt du?
Lösung mit Begründung ansehen
Die Leseseite: Feld in der Leseansicht ergänzen und die Projektion anpassen. Das Schreibmodell bleibt unberührt, solange keine Fachregel die Nummer braucht.
BewertenEine Alternative abwägen
Ein Team springt sofort auf Stufe 3, obwohl Lesen und Schreiben der Bestellung sehr ähnlich sind. Wie bewertest du das?
Lösung mit Begründung ansehen
Vorteil: freie Leseform und getrennte Skalierung. Nachteil: Projektion, Lesespeicher, Verzögerung und Wiederaufbau müssen gepflegt werden. Empfehlung: bei ähnlichen Formen mit Stufe 1 beginnen und erst bei nachweisbarem Bedarf weiter trennen.
Vertiefen
Diese optionalen Vertiefungen ergänzen das Lernziel dieser Seite.
API Composition
API Composition fragt zur Laufzeit mehrere zuständige Dienste ab und setzt deren Antworten für eine Abfrage zusammen. Ein vorbereitetes Lesemodell hält dagegen eine bereits projizierte Sicht bereit, die vor der Anfrage aktualisiert wird. Laufzeitkomposition vermeidet eine zusätzliche Projektion, kann aber Antwortzeit und Verfügbarkeit von mehreren Diensten abhängig machen; ein Lesemodell beschleunigt gezielte Abfragen, braucht dafür Aktualisierungs- und Wiederaufbauregeln. Beide Ansätze können CQRS-Leseverträge bedienen.
Zum AusprobierenAbfrageweg vergleichen. Wähle eine konkrete Shopübersicht, benenne ihre benötigten Quellen und vergleiche Laufzeitkomposition mit einem vorberechneten Lesemodell. Halte Antwortzeit, Ausfallverhalten, Aktualitätszusage und Aufwand für Aktualisierung oder Wiederaufbau fest.
Weiterführende Bausteine
Quellen
- Martin Fowler · CQRS (öffnet in neuem Tab)Erklärt getrennte Schreib- und Lesemodelle einschließlich zusätzlicher Komplexität.
- Microsoft · CQRS Pattern (öffnet in neuem Tab)Zeigt Lese- und Schreibmodelle sowie Konsistenz- und Synchronisationsfragen.
- Microsoft · DDD-oriented Microservice (öffnet in neuem Tab)Ordnet Fachmodell, Anwendungsschicht und Infrastruktur klaren Aufgaben zu.
- Chris Richardson · API Composition (öffnet in neuem Tab)Abfragen über mehrere Dienste zur Laufzeit zusammenstellen; Vergleich mit CQRS-Lesesichten.