Eu percebo que a pergunta acima provavelmente levanta alguns 'what ??', mas deixe-me tentar explicar:
Estou tentando entender alguns conceitos relacionados, basicamente o padrão Saga ( http://www.rgoarchitects.com/Files/SOAPatterns/Saga.pdf ) em combinação com a fonte de eventos (um conceito DDD : http://en.wikipedia.org/wiki/Domain-driven_design )
Uma boa publicação que reúne tudo isso: https://blog.jonathanoliver.com/cqrs-sagas-with-event-sourcing-part-ii-of-ii/
Estou chegando à pergunta em um minuto, mas acho que tenho que tentar resumir o que entendo primeiro (o que pode estar errado, por isso, corrija se for esse o caso), pois isso pode ter um impacto sobre o motivo de eu estar fazendo a pergunta para começar:
- O padrão Saga é um tipo de intermediário que fornece uma ação (usuário final, automatizado etc. essencialmente qualquer coisa que altere dados) divide essa ação nas atividades de negócios e envia cada uma dessas atividades como mensagens para um barramento de mensagens que por sua vez, envia-o para as respectivas raízes agregadas a serem tratadas.
- Essas raízes agregadas podem operar completamente de forma autônoma (boa separação de preocupações, grande escalabilidade etc.)
- Uma instância do Saga em si não contém nenhuma lógica comercial, contida nas raízes agregadas às quais envia atividades. A única 'lógica' contida na Saga é a lógica do 'processo' (geralmente implementada como uma máquina de estado), que determina com base nas ações recebidas (bem como nos eventos de acompanhamento) o que fazer (ou seja, quais atividades enviar)
- Os padrões Saga implementam um tipo de padrão de transação distribuída. Ou seja: quando uma das raízes agregadas (que novamente trabalha autonomamente, sem o conhecimento de outras existências) falha, toda a ação pode ter que ser revertida.
- Isso é implementado com todas as raízes agregadas, após a conclusão do relatório de atividades da Saga. (Em caso de sucesso, bem como erro)
- Caso todas as raízes agregadas retornem um sucesso, a máquina de estado interna se a Saga determinar o que fazer em seguida (ou decidir que está pronto)
- Em caso de falha, a Saga emite para todas as raízes agregadas que participaram da última ação a chamada Ação de compensação, ou seja: uma ação para desfazer a última ação que cada uma das raízes agregadas fez.
- Isso pode ser simplesmente fazer um 'menos 1 voto' se a ação for "mais 1 voto", mas pode ser mais complicado como restaurar um post do blog para a versão anterior.
- A terceirização de eventos (consulte a postagem do blog que combina os dois) visa externalizar salvando os resultados de cada uma das atividades que cada uma das raízes agregadas realiza em um Armazenamento de Eventos centralizado (as alterações são chamadas de 'eventos' neste contexto)
- Esse armazenamento de eventos é a 'versão única da verdade' e pode ser usado para reproduzir o estado de todas as entidades simplesmente iterando os eventos armazenados (essencialmente como um log de eventos)
- Combinar os dois (ou seja: deixar que as raízes agregadas usem a Origem de Eventos para terceirizar salvando suas alterações antes de relatar a Saga) oferece muitas possibilidades interessantes, uma das quais diz respeito à minha pergunta ...
Eu senti que precisava tirar isso do meu ombro, já que é muito para entender de uma só vez. Dado este contexto / mentalidade (novamente, corrija se estiver errado)
a pergunta: quando uma raiz agregada recebe uma Ação de compensação e se essa raiz agregada terceiriza suas alterações de estado usando a Origem de eventos, a Ação de compensação em todas as situações não seria apenas uma exclusão do último evento no armazenamento de eventos Raiz Agregada? (Supondo que a implementação persistente permita exclusões)
Isso faria muito sentido para mim (e seria outro grande benefício dessa combinação), mas como eu disse, eu poderia estar fazendo essas suposições com base em um entendimento incorreto / incompleto desses conceitos.
Espero que isso não fique muito longo.
Obrigado.