Recherche et persistance d'événements

12

Je lis sur la recherche d'événements et j'ai une question concernant la persistance.

Je peux toujours avoir une base de données avec toutes les entités, non? Ou les événements doivent-ils être rejoués à chaque démarrage de l'application pour obtenir la dernière version de chaque entité en mémoire? Semble comme un gaspillage sur des systèmes plus grands (comme dans une grande quantité de données)?

Le point avec la recherche d'événements est que je peux relire les événements pour remplir un magasin de données si nécessaire? (ou analyser les données)

jgauffin
la source

Réponses:

9

Vous bénéficierez le plus du sourcing d'événements lorsque vous décidez de modifier également l'architecture de votre système. Aller vers une architecture de style CQRS combinée avec DDD apportera les vrais avantages d'un sourcing d'événements, du moins à mon avis.

Construire un magasin d'événements qui se comporte bien dans les grands systèmes n'est pas une tâche facile. La relecture de toutes les données peut être coûteuse, en effet, dépend beaucoup de la quantité de données à relire. Mais il existe des techniques qui pourraient vous y aider, l'une d'entre elles étant le concept d'un instantané. La relecture ne se fait qu'à partir d'un certain point. Les avantages qu'un magasin d'événements apporte à votre système sont inestimables. Ayant tout ce qui s'est passé dans votre système rejouable, toutes les données à chaque instant sont une grande chose. Pensez à l'analyse, à la reproduction des bogues, aux statistiques.

Il y a beaucoup de grands magasins d'événements, le dernier vient de sortir hier Event Store et il semble être vraiment bon.

La base de données traditionnelle peut être conservée pour la partie requête de votre système afin de créer des DTO avec les données demandées. Cette base de données peut être organisée et optimisée en fonction des besoins de requête de votre application et de vos clients.

J'ai écrit un article détaillé sur les avantages et à quoi ressemble une architecture CQRS combinée à un sourcing d'événements. Vous pouvez le vérifier sur CQRS, les événements de domaine et la révision DDD .

Vadim
la source
1
Je sais tout sur le CQRS et le DDD. Je comprends les avantages du sourcing d'événements. Les instantanés sont un excellent moyen d'accélérer le processus. Cela ne fait cependant pas partie de la question. Mais la question était plutôt de savoir où tous les modèles / entités seraient stockés une fois chargés. En mémoire (nécessiterait BEAUCOUP de mémoire sur des systèmes plus importants) ou dans une base de données? Quelle est la meilleure pratique?
jgauffin
1
Lors de la recréation d'un agrégat pour exécuter une commande donnée, les événements sont rejoués et l'agrégat conservé en mémoire, exécute l'action, génère les événements, puis stocke les événements dans le magasin d'événements. Mais oui, l'agrégat avec ses objets et entités de valeur serait conservé en mémoire. Il n'est pas nécessaire de les conserver dans une autre base de données. Ce serait normalement une courte période de temps jusqu'à ce que la commande soit terminée de toute façon. Si vous avez des commandes qui s'étendent sur plusieurs agrégats, ce qui est un peu différent, cela pourrait aussi signaler des problèmes de conception avec vos contextes délimités.
Vadim du
9

Avec Event Sourcing, la question principale est "quel est votre livre de référence".

Si votre livre d'enregistrement est votre flux d'événements, vous n'aurez aucun problème. Si votre livre d'archives est votre «modèle d'entité», les problèmes commenceront à se produire partout. En partie, vous pouvez dire "si je perdais mon modèle d'entité, pourrais-je le reconstruire à partir de mon flux d'événements". Si vous êtes positif sur cette question, votre journal des événements est votre registre.

Il est également important de se rappeler que la plupart des gens qui utilisent la recherche d'événements utilisent un modèle de lecture. Ce modèle est utilisé pour interroger des données. Cependant, cela ressemble plus à un modèle 1nf qu'à un modèle d'entité 3nf. Ils rejouent uniquement les événements pour récupérer les états des agrégats afin de déterminer si les écritures doivent être autorisées.

Greg Young
la source
Salut Greg, je suis nouveau dans le sourcing d'événements, mais je veux vraiment maîtriser cela, pourriez-vous s'il vous plaît suggérer des ressources pour des exemples pratiques et des explications, j'ai regardé et lu beaucoup de choses sur CQRS, ES mais quand je veux démarrer un prototype en l'utilisant, je ne peux vraiment pas savoir où où quand :) J'espère que vous pouvez suggérer quelque chose pour moi (je suis du côté java). Merci pour votre temps.
Vach
1

Je peux toujours avoir une base de données avec toutes les entités, non? Ou les événements doivent-ils être rejoués à chaque démarrage de l'application pour obtenir la dernière version de chaque entité en mémoire?

La réponse dépend des exigences de votre application. Je l'ai vu fonctionner dans les deux sens.

Un progiciel extrêmement réussi pour les petits cabinets comptables lit son journal CQRS à chaque démarrage. La quantité brute de données était relativement petite, donc le temps de démarrage était inférieur à une minute même sur des ordinateurs plus lents. Ils pratiquent le CQRS depuis plus d'une décennie avant que la pratique ne devienne populaire. Ils savaient qu'ils étaient sur quelque chose de bien quand ils ont réalisé qu'ils pouvaient mettre à niveau leurs données client encore et encore sans rencontrer de problèmes qu'ils voient avec leurs systèmes plus grands.

Dans les systèmes avec des volumes de données plus importants et / ou des systèmes qui s'appuient sur la fonctionnalité SGBDR pour implémenter le côté requête, vous disposez d'une base de données pour la "vue actuelle" des données provenant des événements (vous pouvez même avoir plusieurs vues de ce type). L'avantage de cette approche est qu'elle vous permet de créer le côté requête à l'aide des technologies connues.

dasblinkenlight
la source
Quel progiciel de comptabilité fait cela?
magnus
@ user1420752 Axys .
dasblinkenlight