Zum Inhalt springen

Command-Query-Responsibility-Segregation

aus Wikipedia, der freien Enzyklopädie
(Weitergeleitet von CQRS)
Datei:CQRS.svg
Funktionsprinzip von CQRS mit Event Sourcing

Die {{Modul:Vorlage:lang}} Modul:Multilingual:153: attempt to index field 'data' (a nil value) (CQRS, [Die Seite Vorlage:IPA/styles.css hat keinen Inhalt.kə'mæ:nd 'kwɪ(ə)ri: ri,spɑnsə'bɪləti ,sɛgrɪ'geiʃ(ə)n] bzw. [Die Seite Vorlage:IPA/styles.css hat keinen Inhalt.si: kju: ɑ:r ɛs],<ref>Martin Fowler: CQRS. 14. Juli 2011, abgerufen am 18. Mai 2014 (Lua-Fehler in Modul:Multilingual, Zeile 153: attempt to index field 'data' (a nil value)).</ref> englisch für etwa „Kommando-Abfrage-Zuständigkeitstrennung“) ist ein Entwurfsmuster für Datenbank-Abfragen, welches durch Greg Young definiert wurde.<ref>Greg Young: CQRS Documents by Greg Young. (PDF) In: WordPress. November 2010, abgerufen am 13. Juli 2014 (Lua-Fehler in Modul:Multilingual, Zeile 153: attempt to index field 'data' (a nil value)).</ref>

Das CQRS-Pattern propagiert eine Aufteilung des Objektmodells in zwei Objektmodelle hinsichtlich der Zugriffe auf die Datenbank:<ref>Die Seite Vorlage:Webarchiv/styles.css hat keinen Inhalt.Archivierte Kopie (Memento des Vorlage:IconExternal vom 28. August 2020 im Internet Archive)  Info: Der Archivlink wurde automatisch eingesetzt und noch nicht geprüft. Bitte prüfe Original- und Archivlink gemäß Anleitung und entferne dann diesen Hinweis.@1@2Vorlage:Webachiv/IABot/codebetter.com</ref>

  • ein Objektmodell für lesende Zugriffe
  • ein Objektmodell für schreibende Zugriffe

Im Gegensatz zu einer CRUD-Sicht für die Zugriffe auf eine Datenbank – wo also ein gemeinsames Objekt für Queries genauso wie für Lesen, Schreiben und Löschen verantwortlich ist – gibt es bei CQRS zwei Objekte: Befehle zum Schreiben (Ändern und Löschen), sowie Abfragen zum Lesen. CQRS wird oft im Zusammenhang mit Event Sourcing, Serviceorientierten Architekturen, etwa im Cloud Computing erwähnt, diese Architekturen können aber genauso gut auch mit CRUD kombiniert werden.

Vorteile gegenüber CRUD[Bearbeiten]

  • Unterschiedliche Skalierbarkeit, schreibende Zugriffe können auf anderen Rechnern laufen als lesende und jeweils unterschiedlich skalieren.
  • Verbesserte Sicherheit durch getrennte Rollen der Schreib- und Leseoperationen
  • Simultaner Einsatz verschiedener Versionen derselben Software möglich
  • Anpassbarkeit an veränderte Geschäfts-Anforderungen
  • Entwicklung der einzelnen Bestandteile durch unterschiedliche Teams

Nachteile gegenüber CRUD[Bearbeiten]

  • Hoher Aufwand in der Softwareentwicklung. Eignet sich eher für Projekte mit vielen gleichzeitigen Benutzern.
  • Benötigt passende Infrastruktur.
  • Transaktionen sind schwer umzusetzen.
  • Querys können durchgeführt werden, bevor Commands durchgeführt wurden. Es werden daher Versionierung und ein In-Memory-Cache benötigt, um sicherzustellen, dass der Client Daten in der richtigen Version erhält.

Frameworks[Bearbeiten]

Die folgenden Frameworks unterstützen bei der Umsetzung dieses Patterns:

.NET
EventFlow<ref>EventFlow. In: GitHub. Abgerufen am 16. Juli 2025 (Lua-Fehler in Modul:Multilingual, Zeile 153: attempt to index field 'data' (a nil value), CQRS- und EventSourcing-Framework für .NET Core).</ref>
Java
OpenCQRS<ref>OpenCQRS. Abgerufen am 11. August 2025 (Lua-Fehler in Modul:Multilingual, Zeile 153: attempt to index field 'data' (a nil value), CQRS- und Event-Sourcing-Framework für die JVM).</ref>
JavaScript
wolkenkit<ref>wolkenkit. Abgerufen am 27. Juni 2017 (Lua-Fehler in Modul:Multilingual, Zeile 153: attempt to index field 'data' (a nil value), CQRS-, DDD- und Event-Sourcing-Framework für JavaScript).</ref>
PHP
prooph<ref>prooph. Abgerufen am 16. Juli 2025 (Lua-Fehler in Modul:Multilingual, Zeile 153: attempt to index field 'data' (a nil value), CQRS and EventSourcing Infrastructure for PHP).</ref>
Python
eventsourcing<ref>eventsourcing. Abgerufen am 16. Juli 2025 (Lua-Fehler in Modul:Multilingual, Zeile 153: attempt to index field 'data' (a nil value), Python-Bibliothek zur Implementierung von Event-Sourcing, inklusive CQRS, mit Erweiterungsprojekten z.B. für Django, SQLAlchemy, Axon Server, KurrentDB oder gRPC).</ref>

Literatur[Bearbeiten]

Weblinks[Bearbeiten]

  • CQRS Journey. In: patterns & practices, MSDN. Microsoft, Juli 2012, abgerufen am 13. Juli 2014 (Lua-Fehler in Modul:Multilingual, Zeile 153: attempt to index field 'data' (a nil value), Tutorial zu CQRS und Event Sourcing in C#).
  • Kanasz Robert: Introduction to CQRS. In: CodeProject. 21. März 2013, abgerufen am 13. Juli 2014 (Lua-Fehler in Modul:Multilingual, Zeile 153: attempt to index field 'data' (a nil value), Einführung in CQRS in C#).
  • Greg Young: CQRS/DDD by Greg Young. In: YouTube. Rinat Abdullin, 20. Januar 2012, abgerufen am 13. Juli 2014 (Lua-Fehler in Modul:Multilingual, Zeile 153: attempt to index field 'data' (a nil value), Einführung in CQRS und DDD).
  • Lev Gorodinski: Domain-Driven Design, Event Sourcing and CQRS with F# and EventStore. In: YouTube. DC F# Meetup, 6. März 2014, abgerufen am 13. Juli 2014 (Lua-Fehler in Modul:Multilingual, Zeile 153: attempt to index field 'data' (a nil value), CQRS und EventSourcing in F#).
  • Golo Roden, Matthias Wagler, Susanna Roden: wolkenkit – The semantic JavaScript backend for event-driven development. Abgerufen am 9. Juli 2017 (PDF, englisch, Einführung in CQRS, DDD und Event-Sourcing)
  • Rethink How You Build Software. the native web GmbH, Juni 2025, abgerufen am 9. Juni 2025 (Lua-Fehler in Modul:Multilingual, Zeile 153: attempt to index field 'data' (a nil value), CQRS, Event-Sourcing, DDD & Co. im Zusammenspiel erklärt).

Quellen[Bearbeiten]

<references />

Die Seite Vorlage:Erweiterte Navigationsleiste/styles legacy.css hat keinen Inhalt.Vorlage:Klappleiste/Anfang

Erzeugungsmuster

Abstrakte Fabrik | Erbauer | Fabrikmethode | Prototyp | Singleton | Multiton | Objektpool

Strukturmuster

Adapter | Brücke | Decorator | Fassade | Fliegengewicht | Kompositum | Stellvertreter

Verhaltensmuster

Beobachter | Besucher | Interpreter | Iterator | Kommando | Memento | Schablonenmethode | Strategie | Vermittler | Zustand | Zuständigkeitskette | Interceptor | Nullobjekt | Protokollstapel

Muster für objekt-
relationale Abbildung

Datentransferobjekt | Table Data Gateway | Row Data Gateway | Active Record | Unit of Work | Identity Map | Lazy Loading | Identity Field | Dependent Mapping | Embedded Value | Serialized LOB | Inheritance Mapper | Metadata Mapping | Query Object | Command-Query-Responsibility-Segregation

Nachrichten-
übermittlungsmuster
andere

Application Controller | Business Delegate | Data Access Object | Dependency Injection | Extension Interface | Fluent Interface | Inversion of Control (IoC) | Lock | Model View Controller (MVC) | Model View Presenter (MVP) | Model View Update (MVU) | Model View ViewModel (MVVM) | Page Controller | Registry | Remote Facade | Repository | Service Locator | Session State | Table Module | Template View | Threadpool | Transaction Script | Transform View | Two-Step View | Value Object

Vorlage:Klappleiste/Ende