MusterKapitel II · Stile & Muster · Baustein 6 von 8

CQRS

CQRS trennt Modelle zum Ändern von Zustand von Modellen zum Lesen. Beide Seiten dürfen ihrer Aufgabe entsprechend gestaltet sein.

  1. Command und QueryBefehl ändert, Abfrage liest nur.
  2. ProjektionÜberträgt Änderungen in die Leseansicht.
  3. 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

Befehle laufen über das Schreibmodell in den Schreibspeicher, eine Projektion füllt den Lesespeicher, aus dem Abfragen über das Lesemodell lesen.
Shop-Beispiel · Stufen der Trennung

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

  1. Command und Query In jeder Stufe die Bahn „Ändern“ mit Befehl und die Bahn „Lesen“ mit Abfrage.
  2. Projektion Stufe 3: Kasten „Projektion“ zwischen Schreibmodell und Lesespeicher.
  3. Nachlaufende Leseansicht Nach dem Befehl: Kundenservice zeigt „bezahlt“, Schreibmodell „versendet“.

Ein Modell, aber Befehle und Abfragen sind getrennte Methoden.

Ändern

  1. Befehl
  2. Bestellmodell
  3. Datenbank

Lesen

  1. Abfrage
  2. Bestellmodell
  3. Datenbank
Zusätzliche Teile
keine
Verzögerung
keine
Leseform
Leseform passt teils

Befehle ändern, Abfragen lesen nur. Beide nutzen dasselbe Bestellmodell; die Leseform bleibt die des Schreibmodells.

Wähle eine Stufe; auf Stufe 3 löst du einen Befehl aus und siehst, wann die Leseansicht nachzieht.

Dieselbe Bestellung B-1042 in zwei Modellen

Dieselbe Bestellung B-1042 in zwei Modellen
FeldSchreibmodell BestellungLeseansicht Kundenservice
IdentitätB-1042B-1042 mit Kundenname
PositionenP-7, Menge 2, vereinbarter Preis, Regelnkurze Liste: 2 × Tasse, 49,90 €
Statuserlaubte Übergänge, z. B. bestätigtlesbarer Gesamtstatus
Zahlung und Versandnur Referenzen, z. B. P-731zusammengeführte Status, Rechnungsnummer
ÄnderungBefehl mit Validierungkeine fachliche Änderung
Aktualisierungwird sofort geschriebenfolgt dem Schreibmodell nach einer Weile
Vergleiche je Zeile: Das Schreibmodell schützt Regeln, die Leseansicht zeigt Fertiges.

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

  1. 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.
  2. 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.
  3. 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

  1. 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.

  2. 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.

  3. 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.