Wie das Entwurfsmuster CQRS zu einem leistungsfähigeren System und mehr Struktur beitragen kann
Bertrand Meyer definiert den Begriff Command Query Segregation damit, dass die Methode eines Objektes entweder eine Abfrage oder ein Kommando sein soll. Bei einer Abfrage handelt es sich demnach um eine Methode, die Daten liefert. Während ein Kommando dazu gedacht ist Daten zu ändern. Sei es das hinzufügen neuer Daten oder das aktualisieren bestehender Daten.
Das Entwurfsmuster Command Query Responsibility Segregation (CQRS) greift diese Definition auf, führt sie aber auf eine Architekturebene. Die Abbildung zeigt beispielhaft wie eine solche Architektur gestaltet werden kann. Entscheidend ist die Trennung der Logik in eine Abfrage- und eine Schreibseite. Eine Referenzimplementierung entsprechend der Abbildung bündelt dementsprechend sämtliche Abfragelogik in der Abfrageseite. Während die Schreibseite wiederum die Logik enthält um Daten zu ändern, zu aktualisieren oder zu löschen.
Theoretisch kann das CQRS Muster so genau genommen werden, dass selbst die Datenbank aufgesplittet wird. Damit entsteht die Möglichkeit die Datenbank der Schreibseite auf das Schreiben von Daten zu optimieren, während die Datenbank der Abfrageseite auf Abfragen optimiert werden kann. Um die Datenstände in beiden Datenbanken konsistent zu halten, müssen Änderungen in der Datenbank der Schreibseite folglich an die Datenbank der Abfrageseite kommuniziert werden. Die Trennung der Datenbank bedeutet aber zusätzliche Komplexität, weshalb von Fall zu Fall abzuwägen ist ob diese Trennung sinnvoll ist.
Vorteil der Trennung nach dem CQRS Muster ist insbesondere die unabhängige Implementierung von Abfrage- und Schreiblogik. Damit geht zum einen eine einfachere Skalierung einher, denn in manchen Fällen kann es zum Beispiel besonders relevant sein die Schreibleistung des Systems zu optimieren. Aufgrund der Trennung kann die Optimierung unabhängig der Abfrageseite umgesetzt werden. Außerdem reduziert die unabhängige Implementierung die Komplexität, da Schreibvorgänge und Abfragen als unabhängige Problemstellungen betrachtet werden können. Auch führt die Trennung zu einem leichter erweiterbaren System, da weniger Seiteneffekte und Abhängigkeiten bestehen.