Quels sont les inconvénients de l'utilisation de l'Event sourcing et du CQRS?
Event sourcing et CQRS est grand parce qu'il obtient rid développeurs d'être coincé avec un pré modelée à la base de données que le développeur a à travailler avec la durée de vie de l'application, sauf si il y a une grande migration de données de projet. Le CQRS et le ES ont aussi d'autres avantages comme la mise à l'échelle de la boutique d'événements, le journal de vérification, etc. qui sont déjà partout sur internet.
Mais quels sont les inconvénients ?
voici quelques inconvénients que je peux penser à après rechercher et écrire de petites applications de démonstration
- Complexe: certains disent que ES est complexe. Mais je dirais qu'avoir une application complexe est mieux qu'un modèle de base de données complexe sur lequel on ne peut exécuter que des requêtes très restreintes en utilisant un langage de requête (jointures multiples, index, etc.). Je veux dire que certains langages de programmation comme Scala ont une bibliothèque de collection très riche qui est très flexible pour produire des agrégations sérieusement complexes et Il ya aussi Apache Spark qui rend il est facile de requêtes distribuées collections. Mais les bases de données seront toujours limitées à ses capacités de langage d'interrogation et la distribution des bases de données est plus difficile que le code d'application distribué (il suffit de déployer une autre instance sur une autre machine!).
- utilisation de l'espace disque: Event store pourrait finir par utiliser beaucoup d'espace disque pour stocker des événements. Mais nous pouvons programmer un nettoyage toutes les quelques semaines et créer des instantanés et peut-être nous pouvons stocker des événements historiques localement sur une HD externe juste incase nous avons besoin de vieux événements dans le futur ?
- utilisation Élevée de la mémoire: L'État de chaque objet de domaine est stocké en mémoire ce qui pourrait augmenter L'utilisation de la RAM et nous tous combien la RAM est chère. GROS PROBLÈME!! parce que je suis pauvre! toute solution à cela ? Peut - être utiliser Sqlite au lieu de stocker l'état dans la mémoire ? Est-ce que je rends les choses plus complexes en introduisant plusieurs instances Sqlite dans mon application ?
- Plus de démarrage temps: en cas d'échec ou de mise à niveau du logiciel, l'amorçage est lent en fonction du nombre d'événements. Mais on peut utiliser des instantanés pour résoudre ça ?
- consistance finale: Problème pour certaines applications. Imaginez si Facebook utilisait Event sourcing avec CQRS pour stocker les messages et compte tenu de la façon dont le système de facebook est occupé et si j'ai posté un post, je verrais mon post fb le lendemain:)
- événements sérialisés dans le magasin D'événements: les magasins D'événements stockent les événements sous forme de objets sérialisés ce qui signifie que nous ne pouvons pas interroger le contenu des événements dans le magasin d'événements qui est de toute façon découragé. Et nous ne serons pas en mesure d'ajouter un autre attribut à l'événement dans le futur. La Solution serait de stocker les événements comme des objets JSON au lieu d'événements sérialisés ? Mais est-ce une bonne idée ? Ou ajouter d'autres événements pour supporter le changement à l'objet événement original ?
quelqu'un peut-il s'il vous plaît commenter les inconvénients que j'ai mentionnés ici et me corriger si je me trompe et suggérer tout les autres j'ai peut-être raté ?
3 réponses
Voici mon point de vue sur ce.
CQRS + ES peuvent rendre les choses beaucoup plus simples dans les systèmes logiciels complexes en ayant des objets de domaine riches, des modèles de données simples, le suivi de l'histoire, plus de visibilité dans les problèmes de concurrence, l'évolutivité et beaucoup plus. Cela nécessite une autre façon de penser les systèmes afin qu'il puisse être difficile de trouver des développeurs qualifiés. Mais le CQRS simplifie la séparation des responsabilités entre les développeurs. Par exemple, un promoteur débutant peut: travailler purement avec le côté lu sans avoir à toucher à la logique de l'entreprise.
les Copies de données auront besoin de plus d'espace disque à coup sûr. Mais le stockage est relativement bon marché de nos jours. Il peut être nécessaire que l'équipe de soutien informatique fasse plus de sauvegardes et planifie comment restaurer le système dans un cas où les choses vont mal. Cependant, la virtualisation des serveurs de nos jours en fait un workflow plus rationalisé. En outre, il est beaucoup plus facile de créer la redondance dans le système sans un monolithique la base de données.
Je ne considère pas l'utilisation de mémoire supérieure comme un problème. L'hydratation de l'objet d'affaires doit être effectuée sur demande. Les objets ne doivent pas contenir de références à des événements qui ont déjà persisté. Et l'hydratation de l'événement ne doit se produire que lorsque les données persistent. Du côté de la lecture, vous n'avez pas de conversions Entity -> DTO -> ViewModel qui se produisent habituellement dans les systèmes hiérarchisés, et vous n'auriez pas n'importe quel type de suivi de changement d'objet que les ORMs complets présentés font habituellement. La plupart des les systèmes font beaucoup plus de lectures que d'Écritures.
Plus de délai d'amorçage 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 données différents contextes. Cependant, 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émarrage à froid" plus rapide que n'importe quel ORM complet présenté. L'important ici est de ne pas compliquer à l'excès la façon dont vous accédez aux données. Que est en fait un problème CQRS est censé résoudre. Et comme je l'ai déjà dit, le côté lu devrait être modelé pour les vues et ne pas avoir de frais généraux de re-mapping des données.
Two-phase commit peut bien fonctionner pour les systèmes qui n'ont pas besoin d'échelle pour des milliers d'utilisateurs dans mon expérience. Vous devez choisir des bases de données qui fonctionneraient bien avec le coordonnateur des transactions distribuées. PostgreSQL peut bien fonctionner pour lire et écrire des modèles séparés, par exemple. Si le système les besoins à l'échelle d'un grand nombre d'utilisateurs simultanés, il devra être conçu avec cohérence éventuelle à l'esprit. Il y a des cas où vous avez des racines agrégées ou des limites de contexte qui n'utilisent pas CQRS pour éviter une cohérence éventuelle. Cela a du sens pour les parties non collaboratives du domaine.
vous pouvez interroger des événements dans un format sérialisé comme 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 de Analytics. Rien dans le système ne devrait interroger event store par autre chose que l'agrégat root id et le type d'événement. Que les données seraient indexées et en direct en dehors de l'événement sérialisé.
Juste pour un commentaire sur le point 5. On m'a dit que Facebook utilise ES avec une consistance éventuelle, c'est pourquoi vous pouvez parfois voir un post disparaître et réapparaître après l'avoir posté.
habituellement, le modèle de lecture auquel votre navigateur accède est situé "près" de vous, mais après avoir créé un message, le SPA passe à un modèle de lecture qui est proche de votre modèle d'écriture. La proximité entre le modèle d'écriture (événements) et le modèle de lecture signifie que vous pouvez voir votre propre post.
cependant, 15 minutes plus tard votre SPA passe de nouveau à la première, plus proche, read-model. Si l'événement contenant votre post n'a pas encore propagé à ce modèle de lecture, vous verrez votre propre poste disparaître seulement pour réapparaître plus tard.
je sais que cela fait presque 3 ans que cette question a été posée, mais encore cet article peut être utile pour quelqu'un. Les points clés sont
- mise à l'Échelle avec des instantanés
- visibilité des données
- changement de schéma
- traiter des domaines complexes
- Besoin de l'expliquer à la plupart des nouveaux membres de l'équipe