Origem e persistência de eventos


11

Estou lendo sobre a fonte de eventos e tenho uma pergunta sobre persistência.

Ainda posso ter um banco de dados com todas as entidades, certo? Ou os eventos devem ser repetidos toda vez que o aplicativo é iniciado para obter a versão mais recente de cada entidade na memória? Parece um desperdício em sistemas maiores (como em grande quantidade de dados)?

O ponto com a fonte de eventos é que eu posso reproduzir os eventos para preencher um armazenamento de dados, se necessário? (ou analise os dados)

Respostas:


9

Com o Event Sourcing, a questão principal é "qual é o seu livro de registro".

Se o seu livro de registro for o seu fluxo de eventos, você não terá problemas. Se o seu livro de registro for o seu "modelo de entidade", os problemas começarão a acontecer em todo o lugar. Parte disso é que você pode dizer "se eu perdi meu modelo de entidade, poderia reconstruí-lo a partir do meu fluxo de eventos". Se você está positivo nessa questão, seu Log de eventos é o seu livro de registro.

Também é importante lembrar que a maioria das pessoas que usa a fonte de eventos usa um modelo de leitura. Este modelo é usado para consultar dados. É mais provável que isso pareça um modelo de 1nf do que um modelo de entidade de 3nf. Eles apenas reproduzem eventos para recuperar os estados dos agregados para determinar se as gravações devem ser permitidas.


Olá Greg, eu sou novo em sourcing de eventos, mas eu realmente quero dominar isso, você poderia sugerir alguns recursos para exemplos e explicações práticas? Eu assisti e li muito sobre CQRS, ES, mas quando eu quero iniciar um protótipo usá-lo eu realmente não consigo descobrir o que onde quando :) Espero que você possa sugerir algo para mim (eu estou no lado java). Obrigado pelo seu tempo.
vach

8

Você se beneficiará ao máximo da fonte de eventos quando decidir alterar também a arquitetura do sistema. Ir para uma arquitetura de estilo CQRS combinada com DDD trará os verdadeiros benefícios de uma fonte de eventos, pelo menos na minha opinião.

Construir um armazenamento de eventos que se comporte bem em sistemas grandes não é uma tarefa fácil. A reprodução de todos os dados pode ser cara, depende muito da quantidade de dados que precisa ser reproduzida. Mas existem técnicas que podem ajudá-lo com isso, sendo uma delas o conceito de um instantâneo. A repetição é feita apenas a partir de um certo ponto em diante. As vantagens que um armazenamento de eventos traz para o seu sistema são inestimáveis. Tendo tudo o que aconteceu no seu sistema reproduzível, todos os dados em todos os momentos são ótimos. Pense na análise, na reprodução de bugs, nas estatísticas.

Existem muitas ótimas lojas de eventos, a última foi lançada ontem Event Store e parece realmente boa.

O banco de dados tradicional pode ser mantido para a parte de consulta do seu sistema criar DTOs com os dados solicitados. Esse banco de dados pode ser organizado e otimizado, considerando as necessidades de consulta do seu aplicativo e clientes.

Escrevi um artigo detalhado sobre quais são os benefícios e como é realmente uma arquitetura CQRS combinada com a fonte de eventos. Você pode conferir CQRS, eventos de domínio e revisão de DDD .


11
Eu sei tudo sobre CQRS e DDD. Compreendo os benefícios do fornecimento de eventos. Os instantâneos são uma ótima maneira de acelerar o processo. No entanto, isso não faz parte da questão. Mas a questão era: onde todos os modelos / entidades seriam armazenados depois de carregados. Na memória (exigiria muita memória em sistemas maiores) ou em um banco de dados? Qual é a melhor prática?
precisa saber é o seguinte

11
Ao recriar um agregado para executar um determinado comando, os eventos serão repetidos e o agregado mantido na memória, execute a ação, gere os eventos e, em seguida, armazene os eventos no armazenamento de eventos. Mas sim, o agregado com seus objetos e entidades de valor seria mantido na memória. Não há necessidade de mantê-los em outro banco de dados. Normalmente, esse seria um curto período de tempo até que o comando seja concluído. Se você possui comandos que abrangem várias agregações um pouco diferentes, isso também pode sinalizar alguns problemas de design em seus contextos limitados.
Vadim

1

Ainda posso ter um banco de dados com todas as entidades, certo? Ou os eventos devem ser repetidos toda vez que o aplicativo é iniciado para obter a versão mais recente de cada entidade na memória?

A resposta depende dos requisitos do seu aplicativo. Eu já vi isso nos dois sentidos.

Um pacote de software extremamente bem-sucedido para pequenas empresas de contabilidade lê seu registro CQRS toda vez que é iniciado. A quantidade bruta de dados era relativamente pequena; portanto, o tempo de inicialização era inferior a um minuto, mesmo em computadores mais lentos. Eles praticam o CQRS há mais de uma década antes de a prática se tornar popular. Eles sabiam que estavam conseguindo algo bom quando perceberam que podem atualizar os dados de seus clientes repetidamente, sem encontrar problemas que vêem em seus sistemas maiores.

Em sistemas com volumes maiores de dados e / ou sistemas que dependem da funcionalidade RDBMS para implementar o lado da consulta, você possui um banco de dados para a "visualização atual" dos dados originados por eventos (você pode até ter várias visualizações). A vantagem dessa abordagem é que ela permite criar o lado da consulta usando as tecnologias familiares.


Qual pacote contábil faz isso?
magnus

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.