web-dev-qa-db-fra.com

différence entre cqrs et cqs

J'apprends ce qui est [~ # ~] cqrs [~ # ~] et j'ai appris qu'il y avait aussi [~ # ~] cqs [~ # ~] modèle

Quand j'ai essayé de chercher, j'ai trouvé beaucoup de diagrammes , info sur [~ # ~] cqrs [~ # ~] mais n'a pas trouvé grand-chose sur [~ # ~] cqs [~ # ~]

point clé dans [~ # ~] cqrs [~ # ~] motif

Dans cqrs, il y a un modèle à écrire (modèle de commande) et un modèle à lire (modèle de requête) , qui sont complètement séparés .

enter image description here

Comment [~ # ~] cqs [~ # ~] se différencie de [~ # ~] cqrs [ ~ # ~] . . ?

Quels sont les points clés où les deux se différencient. . ?

Toute aide serait appréciée :)

44
Mr punch

CQS (Command Query Separation) et CQRS (Command Query Responsibility Segregation) sont très liés. Vous pouvez considérer CQS comme étant au niveau de la classe ou du composant, tandis que CQRS est plus au niveau du contexte borné.

J'ai tendance à penser que CQS est au niveau micro et CQRS au niveau macro.

CQS prescrit des méthodes distinctes pour interroger ou écrire dans un modèle: la requête ne mute pas l'état, tandis que la commande mute l'état mais n'a pas de valeur de retour. Il a été conçu par Bertrand Meyer dans le cadre de son travail de pionnier sur le langage de programmation Eiffel.

Le CQRS prescrit une approche similaire, sauf qu'il s'agit plus d'un chemin à travers votre système. Une demande de requête prend un chemin distinct d'une commande. La requête renvoie des données sans altérer le système sous-jacent; la commande modifie le système mais ne renvoie pas de données.

Greg Young a préparé une rédaction assez approfondie de ce que le CQRS est il y a quelques années, et explique comment le CQRS est une évolution du CQS. Ce document m'a présenté le CQRS il y a quelques années, et je le trouve encore un document de référence très utile.

55
David Hoerster

C'est une vieille question, mais je vais tenter de répondre. Je ne réponds pas souvent aux questions sur StackOverflow, alors pardonnez-moi si je fais quelque chose en dehors des limites de la communauté en termes de lien avec les choses, en écrivant une réponse longue, etc.

Il existe de nombreuses différences entre CQRS et CQS, mais CQRS utilise CQS dans sa définition! Commençons par définir les deux, puis nous pourrons discuter des différences.

CQS définit deux types de messages en fonction de leur valeur de retour: aucune valeur de retour (void) spécifie qu'il s'agit d'une commande; une valeur de retour (non vide) spécifie que cette méthode est une requête.

  • Les commandes modifient les informations
  • Les requêtes renvoient des informations

Les commandes changent d'état. Les requêtes ne le font pas.

Maintenant pour CQRS, qui utilise la même définition que CQS pour les commandes et les requêtes. Ce que dit le CQRS, c'est que nous ne voulons pas n objet avec les méthodes Command et Query. Au lieu de cela, nous voulons deux objets: un avec toutes les commandes et un avec toutes les requêtes.

L'idée est globalement très simple; c'est tout après faire cela où les choses deviennent intéressantes. Il y a de nombreuses discussions en ligne, de moi discutant de certains des attributs associés (moyen désolé de trop taper ici!).

6
Greg Young

La plus grande différence est que CQRS utilise des magasins de données séparés pour les commandes et les requêtes. Un magasin de requêtes peut utiliser une technologie différente comme une base de données de documents ou simplement être un schéma dénormalisé dans la même base de données qui facilite la requête des données.

Les données entre les bases de données sont généralement copiées de manière asynchrone à l'aide de quelque chose comme un bus de service. Par conséquent, les données du magasin de requêtes sont finalement cohérentes (elles seront là à un moment donné). Les applications doivent en tenir compte. Bien qu'il soit possible d'utiliser la même transaction (même base de données ou validation en 2 phases) pour écrire dans les deux magasins, il n'est généralement pas recommandé pour des raisons d'évolutivité.

L'architecture CQS lit et écrit à partir du même magasin/tables de données.

4
Dmitry S.

Lire la réponse de l'inventeur Greg Young

Je pense que, comme "Dependency Injection", les concepts sont si simples et pris pour acquis que le fait qu'ils ont des noms fantaisistes semble conduire les gens à penser qu'ils sont quelque chose de plus qu'ils ne le sont, d'autant plus que le CQRS est souvent cité aux côtés d'Event Sourcing.

  • CQS est la séparation des méthodes qui lisent celles qui changent d'état; ne faites pas les deux en une seule méthode. C'est au niveau micro.

  • Le CQRS étend ce concept à un niveau supérieur pour les API machine-machine, la séparation des modèles de message et les chemins de traitement.

Le CQRS est donc un principe que vous appliquez au code dans une API ou une façade.

J'ai trouvé que CQRS était essentiellement un S très fort dans SOLID, poussant la séparation profondément dans la psyché des développeurs pour produire un code plus maintenable.

Je pense que les applications Web ne conviennent pas au CQRS car la mutation d'état via le transfert de représentation signifie que la commande et la requête sont les deux côtés de la même requête-réponse. La représentation est une commande et la réponse est la requête.

Par exemple, vous envoyez une commande et recevez une vue de toutes vos commandes.

Imaginez si le code d'un site Web était pris en compte dans un côté commande et côté requête. Le code de gestion des actions de route devrait tomber dans l'un de ces côtés, mais il fait les deux.

En imaginant une ségrégation plus forte, si le code était déplacé dans deux bases de code compilables différentes, le site Web accepterait un POST d'un formulaire, mais l'utilisateur devrait parcourir une autre URL de site Web pour voir le impact de l'action. Ceci est évidemment fou. Une solution de contournement serait de toujours rediriger, bien que ce ne serait pas vraiment RESTful car l'application idéale REST est l'endroit où la prochaine représentation contient un hypertexte pour piloter le prochaine transition d'état et ainsi de suite.

Étant donné qu'un site Web est une API REST entre l'homme et la machine (ou la machine et la machine), cela inclut également les API REST, bien que d'autres types de messages HTTP passent L'API peut être parfaitement adaptée au CQRS.

Un service ou une façade dans les limites du site Web peut évidemment bien fonctionner avec le CQRS, bien que les gestionnaires d'action se situent en dehors de cette limite.

Voir CQS sur Wikipedia

3
Luke Puplett
  • CQS concerne les commandes et les requêtes. Il ne se soucie pas du modèle. Vous disposez en quelque sorte de services séparés qui ne lisent que les données et de services qui modifient les données.
  • Le CQRS concerne des modèles distincts pour les écritures et les lectures. Bien sûr, l'utilisation du modèle d'écriture lit souvent quelque chose pour répondre à la logique métier, mais vous ne pouvez effectuer des lectures que sur le modèle de lecture. Des bases de données distinctes sont à la pointe de la technologie. Mais imaginez une base de données unique avec des modèles distincts pour la lecture et l'écriture modélisés en OR/M. C'est très souvent assez bon.

J'ai constaté que les gens disent souvent qu'ils pratiquent le CQRS lorsqu'ils ont le CQS.

1
Tomasz Rzepecki