L'approvisionnement en événements et CQRS sont excellents, car ils empêchent les développeurs de solutions informatiques de rester bloqués avec une base de données pré-modélisée avec laquelle ils doivent travailler pendant toute la durée de vie de l'application, à moins d'un projet de migration Big Data. CQRS et ES offrent également d’autres avantages, tels que la mise à l’échelle d’événementsstore, le journal d’audit, etc., déjà sur Internet.
Mais quels sont les inconvénients?
Voici quelques inconvénients auxquels je peux penser après avoir recherché et écrit de petites applications de démonstration.
Quelqu'un peut-il s'il vous plaît commenter les inconvénients que j'ai évoqués ici et me corriger si je me trompe et suggérer tout autre que j'ai peut-être manqué?
Voici mon point de vue sur ceci.
CQRS + ES simplifie énormément la tâche dans les systèmes logiciels complexes en offrant des objets de domaine riches, des modèles de données simples, un suivi de l'historique, une visibilité accrue des problèmes de simultanéité, une évolutivité et bien plus encore. Cela nécessite une approche différente de la conception des systèmes, de sorte qu'il pourrait être difficile de trouver des développeurs qualifiés. Mais CQRS simplifie la séparation des responsabilités entre les développeurs. Par exemple, un développeur débutant peut travailler uniquement avec le côté lecture sans toucher à la logique métier.
Les copies de données nécessiteront certainement plus d'espace disque. Mais le stockage est relativement bon marché ces jours-ci. L’équipe de support informatique peut être amenée à effectuer davantage de sauvegardes et à planifier la restauration du système en cas de problème. Cependant, la virtualisation des serveurs en fait un flux de travail plus simple. En outre, il est beaucoup plus facile de créer une redondance dans le système sans base de données monolithique.
Je ne considère pas l'utilisation de mémoire plus importante comme un problème. L'hydratation de l'objet métier doit être effectuée à la demande. Les objets ne doivent pas conserver de références à des événements déjà persistants. Et l'hydratation des événements ne devrait se produire que lorsque les données sont persistantes. Du côté de la lecture, vous ne disposez pas des conversions Entity -> DTO -> ViewModel qui se produisent généralement dans des systèmes multiniveaux, et vous ne disposez d'aucun type de suivi de modification d'objet comme le font habituellement les ORM. La plupart des systèmes effectuent beaucoup plus de lectures que d'écritures.
Un temps de démarrage plus long peut être un léger problème si vous utilisez plusieurs bases de données hétérogènes en raison de l'initialisation de divers contextes de données. Toutefois, si vous utilisez quelque chose de simple, comme ADO .NET, pour interagir avec le magasin d'événements et un micro-ORM pour le côté lecture, le système «démarrera à froid» plus rapidement que tout ORM complet. La chose importante ici est de ne pas trop compliquer la façon dont vous accédez aux données. C’est un problème que CQRS est censé résoudre. Et comme je l’ai déjà dit, le côté lecture devrait être modélisé pour les vues et ne pas générer de surcharge de données de remappage.
La validation en deux phases peut bien fonctionner pour les systèmes qui, selon mon expérience, ne doivent pas nécessairement être étendus. Vous devrez choisir des bases de données qui fonctionneraient bien avec le coordinateur de transactions distribuées. PostgreSQL peut par exemple bien fonctionner en lecture et en écriture. Si le système doit s’adapter à un grand nombre d’utilisateurs simultanés, il devra être conçu avec une cohérence éventuelle à l’esprit. Il existe des cas où vous avez des racines globales ou des limites de contexte qui n'utilisent pas CQRS pour éviter une éventuelle cohérence. Cela a du sens pour les parties non collaboratives du domaine.
Vous pouvez interroger des événements dans un format sérialisé, tel que JSON ou XML, si vous choisissez la bonne base de données pour le magasin d'événements. Et cela ne devrait être fait qu'à des fins d'analyse. Rien dans le système ne devrait interroger le magasin d'événements par autre chose que l'ID racine agrégée et le type d'événement. Ces données seraient indexées et vivraient en dehors de l'événement sérialisé.
Juste pour commenter le point 5. On m'a dit que Facebook utilise effectivement les ES avec une cohérence éventuelle, c'est pourquoi vous pouvez parfois voir un message disparaître et réapparaître après l'avoir posté.
En règle générale, le modèle de lecture auquel votre navigateur accède est situé «près» de vous, mais après la publication d'un message, le SPA bascule vers un modèle de lecture proche de votre modèle d'écriture. La proximité étroite entre le modèle d'écriture (événements) et le modèle de lecture vous permet de voir votre propre message.
Cependant, 15 minutes plus tard, votre SPA bascule vers le premier modèle, plus proche, en lecture. Si l'événement contenant votre message n'a pas encore été propagé à ce modèle en lecture, votre propre message disparaîtra pour réapparaître ultérieurement.
Je sais que cela fait presque trois ans que cette question a été posée, mais quand même cet article peut être utile pour quelqu'un. Les points clés sont
L'approvisionnement en événements et CQRS sont excellents, car ils empêchent les développeurs de solutions informatiques de rester bloqués avec une base de données pré-modélisée avec laquelle ils doivent travailler pendant toute la durée de vie de l'application, à moins d'un projet de migration Big Data.
C'est une grosse idée fausse. Les bases de données relationnelles ont été inventées exactement pour l'évolution du modèle (grâce à de simples tableaux bidimensionnels par opposition à des structures hiérarchiques prédéfinies). Avec les vues et les procédures assurant l'encapsulation de l'accès aux données, le modèle logique et physique peut évoluer de manière indépendante. C’est aussi pourquoi SQL définit DDL et DML dans le même langage. Certains SGBDR permettent également à toutes ces évolutions d'être versionnées et déployées en ligne (livraison continue) en tant que redéfinition basée sur Oracle Edition.
Les structures de données volumineuses sont prédéfinies et ne peuvent être lues qu'avec le code développé pour cette structure. Ok lorsqu'il est consommé immédiatement, mais vous aurez du mal à le lire 10 ans plus tard sans la version exacte, ni le compilateur ni l'interpréteur.