Command-Query-Responsibility-Segregation

Die Command Query Responsibility Segregation (CQRS, [ ] bzw. [ ],[1] englisch für etwa „Kommando-Abfrage-Zuständigkeitstrennung“) ist ein Entwurfsmuster für Datenbank-Abfragen, welches durch Greg Young definiert wurde.[2]
Das CQRS-Pattern propagiert eine Aufteilung des Objektmodells in zwei Objektmodelle hinsichtlich der Zugriffe auf die Datenbank:[3]
- 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 | Quelltext 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
- Beibehaltung von Rückwärtskompatibilität möglich
- Migration auf neue Version im Live-Betrieb ohne Downtime möglich
- Anpassbarkeit an veränderte Geschäfts-Anforderungen
- Entwicklung der einzelnen Bestandteile durch unterschiedliche Teams
Nachteile gegenüber CRUD
[Bearbeiten | Quelltext 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 | Quelltext bearbeiten]Die folgenden Frameworks unterstützen bei der Umsetzung dieses Patterns:
- .NET
- EventFlow[4]
- JavaScript
- wolkenkit[5]
- PHP
- prooph[6]
Literatur
[Bearbeiten | Quelltext bearbeiten]- Chris Richardson: Microservices Patterns. Manning, Shelter Island NY 2019, ISBN 978-1-61729-454-9, S. 228–252 (amerikanisches Englisch).
Weblinks
[Bearbeiten | Quelltext bearbeiten]- CQRS Journey. In: patterns & practices, MSDN. Microsoft, Juli 2012, abgerufen am 13. Juli 2014 (englisch, Tutorial zu CQRS und Event Sourcing in C#).
- Kanasz Robert: Introduction to CQRS. In: CodeProject. 21. März 2013, abgerufen am 13. Juli 2014 (englisch, 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 (englisch, 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 (englisch, 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)
Quellen
[Bearbeiten | Quelltext bearbeiten]- ↑ Martin Fowler: CQRS. 14. Juli 2011, abgerufen am 18. Mai 2014 (englisch).
- ↑ Greg Young: CQRS Documents by Greg Young. (PDF) In: WordPress. November 2010, abgerufen am 13. Juli 2014 (englisch).
- ↑ Archivierte Kopie ( des 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.
- ↑ EventFlow. In: GitHub. Abgerufen am 30. November 2021 (englisch, CQRS- und EventSourcing-Framework für .NET Core).
- ↑ wolkenkit. Abgerufen am 27. Juni 2017 (englisch, CQRS-, DDD- und Event-Sourcing-Framework für JavaScript).
- ↑ prooph. Abgerufen am 1. Februar 2018 (englisch, CQRS und Event Sourcing Infrastruktur für PHP).