it-swarm.com.de

Unterschied zwischen cqrs vs cqs

Ich lerne, was [~ # ~] cqrs [~ # ~] ist und erfahre, dass es auch gibt ) [~ # ~] cqs [~ # ~] Muster

Als ich versuchte zu suchen, fand ich viele Diagramme , Info auf [~ # ~] cqrs [~ # ~] , aber nicht viel über [~ # ~] cqs gefunden [~ # ~]

schlüsselpunkt in [~ # ~] cqrs [~ # ~] Muster

In cqrs gibt es ein Modell zum Schreiben (Befehlsmodell) und ein Modell zum Lesen (Abfragemodell) , die vollständig getrennt sind .

enter image description here

Wie unterscheidet sich [~ # ~] cqs [~ # ~] von [~ # ~] cqrs [ ~ # ~] . . ?

Was sind die Schlüsselpunkte , an denen beide differenziert werden. . ?

Jede Hilfe wäre dankbar :)

44
Mr punch

CQS (Command Query Separation) und CQRS (Command Query Responsibility Segregation) sind eng miteinander verbunden. Sie können sich CQS auf Klassen- oder Komponentenebene vorstellen, während sich CQRS eher auf der Ebene des begrenzten Kontexts befindet.

Ich neige dazu, CQS auf Mikroebene und CQRS auf Makroebene zu betrachten.

CQS schreibt separate Methoden zum Abfragen von oder Schreiben in ein Modell vor: Die Abfrage ändert den Status nicht, während der Befehl den Status ändert, jedoch keinen Rückgabewert hat. Es wurde von Bertrand Meyer im Rahmen seiner Pionierarbeit an der Programmiersprache Eiffel entwickelt.

CQRS schreibt einen ähnlichen Ansatz vor, mit der Ausnahme, dass es sich eher um einen Pfad durch Ihr System handelt. Eine Abfrageanforderung benötigt einen von einem Befehl getrennten Pfad. Die Abfrage gibt Daten zurück, ohne das zugrunde liegende System zu ändern. Der Befehl ändert das System, gibt jedoch keine Daten zurück.

Greg Young hat eine ziemlich gründliche Beschreibung dessen, was CQRS vor einigen Jahren ist, zusammengestellt und geht auf die Entwicklung von CQRS als CQS ein. Dieses Dokument hat mich vor einigen Jahren mit CQRS bekannt gemacht und ich finde es immer noch ein sehr nützliches Referenzdokument.

55
David Hoerster

Dies ist eine alte Frage, aber ich werde versuchen, sie zu beantworten. Ich beantworte nicht oft Fragen zu StackOverflow. Verzeihen Sie mir, wenn ich etwas außerhalb der Grenzen der Community tue, was das Verknüpfen von Dingen, das Schreiben einer langen Antwort usw. betrifft.

Es gibt viele Unterschiede zwischen CQRS und CQS, jedoch verwendet CQRS CQS innerhalb seiner Definition! Beginnen wir mit der Definition der beiden und diskutieren dann die Unterschiede.

CQS definiert zwei Arten von Nachrichten in Abhängigkeit von ihrem Rückgabewert: Kein Rückgabewert (void) gibt an, dass es sich um einen Befehl handelt. Ein Rückgabewert (nicht ungültig) gibt an, dass es sich bei dieser Methode um eine Abfrage handelt.

  • Befehle ändern Informationen
  • Abfragen geben Informationen zurück

Befehle ändern den Status. Abfragen nicht.

Jetzt für CQRS, das dieselbe Definition wie CQS für Befehle und Abfragen verwendet. Was CQRS sagt, ist, dass wir nicht ein Objekt mit Command- und Query-Methoden wollen. Stattdessen wollen wir zwei Objekte: eines mit allen Befehlen und eines mit allen Abfragen.

Die Idee ist insgesamt sehr einfach; Es ist alles , nachdem dies getan hat, wo die Dinge interessant werden. Es gibt zahlreiche Online-Vorträge, in denen ich einige der damit verbundenen Attribute diskutiere (leider viel zu viel, um hier zu tippen!).

6
Greg Young

Der größte Unterschied besteht darin, dass CQRS separate Datenspeicher für Befehle und Abfragen verwendet. Ein Abfragespeicher kann eine andere Technologie wie eine Dokumentendatenbank verwenden oder nur ein denormalisiertes Schema in derselben Datenbank sein, wodurch das Abfragen der Daten vereinfacht wird.

Die Daten zwischen Datenbanken werden normalerweise asynchron mit einem Service-Bus kopiert. Daher sind die Daten im Abfragespeicher möglicherweise konsistent (sie werden irgendwann verfügbar sein). Anwendungen müssen das berücksichtigen. Es ist zwar möglich, dieselbe Transaktion (dieselbe Datenbank oder ein zweiphasiges Commit) zum Schreiben in beide Stores zu verwenden, dies wird jedoch aus Gründen der Skalierbarkeit normalerweise nicht empfohlen.

Die CQS-Architektur liest und schreibt aus demselben Datenspeicher/denselben Tabellen.

4
Dmitry S.

Lies die Antwort des Erfinders Greg Young

Ich denke, wie bei "Dependency Injection" sind die Konzepte so einfach und selbstverständlich, dass die Tatsache, dass sie ausgefallene Namen haben, die Leute zu der Annahme zu bewegen scheint, dass sie mehr sind als sie sind, zumal CQRS oft neben Event Sourcing zitiert wird.

  • CQS ist die Trennung von Methoden, die für diejenigen gelesen werden, die den Status ändern. Machen Sie nicht beides in einer einzigen Methode. Dies ist Mikroebene.

  • CQRS erweitert dieses Konzept auf eine höhere Ebene für Maschine-Maschine-APIs, die Trennung von Nachrichtenmodellen und Verarbeitungspfaden.

CQRS ist also ein Prinzip, das Sie auf den Code in einer API oder Fassade anwenden.

Ich habe festgestellt, dass CQRS im Wesentlichen ein sehr starkes S in SOLID ist, das die Trennung tief in die Psyche der Entwickler drückt, um besser wartbaren Code zu produzieren.

Ich denke, Webanwendungen passen schlecht zu CQRS, da die Veränderung des Zustands durch Repräsentationstransfer bedeutet, dass Befehl und Abfrage zwei Seiten derselben Anfrage-Antwort sind. Die Darstellung ist ein Befehl und die Antwort ist die Abfrage.

Beispielsweise senden Sie eine Bestellung und erhalten eine Übersicht über alle Ihre Bestellungen.

Stellen Sie sich vor, der Code einer Website würde in eine Befehls- und Abfrageseite zerlegt. Der Code für die Behandlung von Routenaktionen müsste auf eine dieser Seiten fallen, aber es ist beides möglich.

Stellen Sie sich eine stärkere Trennung vor, wenn der Code in zwei verschiedene kompilierbare Codebasen verschoben würde, würde die Website ein POST eines Formulars akzeptieren, aber der Benutzer müsste zu einer anderen Website-URL navigieren, um die zu sehen Dies ist offensichtlich verrückt. Eine Problemumgehung wäre, immer umzuleiten, obwohl dies nicht wirklich RESTful wäre, da die ideale REST Anwendung dort ist, wo die nächste Darstellung Hypertext enthält, um die nächster Zustandsübergang und so weiter.

Da eine Website eine REST API zwischen Mensch und Maschine (oder Maschine und Maschine) ist, umfasst dies auch REST APIs, obwohl andere Arten der HTTP-Nachrichtenübermittlung möglich sind API passt möglicherweise perfekt zu CQRS.

Ein Dienst oder eine Fassade innerhalb der Grenzen der Website kann offensichtlich gut mit CQRS zusammenarbeiten, obwohl die Aktionshandler außerhalb dieser Grenze sitzen würden.

Siehe CQS auf Wikipedia

3
Luke Puplett
  • Bei CQS geht es um Befehle und Abfragen. Es kümmert sich nicht um das Modell. Sie haben irgendwie Dienste, die nur Daten lesen, und Dienste, die Daten ändern, getrennt.
  • Bei CQRS handelt es sich um separate Modelle für Schreiben und Lesen. Natürlich liest die Verwendung des Schreibmodells häufig etwas, um die Geschäftslogik zu erfüllen, aber Sie können nur Lesevorgänge für das Lesemodell ausführen. Separate Datenbanken sind Stand der Technik. Stellen Sie sich jedoch eine einzelne Datenbank mit separaten Modellen für Lese- und Schreibvorgänge vor, die in OR/M modelliert sind. Es ist sehr oft gut genug.

Ich habe festgestellt, dass die Leute oft sagen, sie praktizieren CQRS, wenn sie CQS haben.

1
Tomasz Rzepecki