Me doy cuenta de que la pregunta anterior probablemente plantea algunos "¿qué?", Pero déjame intentar explicar:
Estoy tratando de entender un par de conceptos relacionados, básicamente el patrón Saga ( http://www.rgoarchitects.com/Files/SOAPatterns/Saga.pdf ) en combinación con Event-sourcing (A DDD-concept : http://en.wikipedia.org/wiki/Domain-driven_design )
Una buena publicación que lo resume: https://blog.jonathanoliver.com/cqrs-sagas-with-event-sourcing-part-ii-of-ii/
Llegaré a la pregunta en un minuto, pero creo que tengo que intentar resumir lo que entiendo primero (lo cual podría estar mal, así que corríjalo si ese es el caso) ya que esto podría afectar por qué estoy haciendo la pregunta para comenzar:
- El patrón Saga es una especie de intermediario que da una acción (usuario final, automatizado, etc., esencialmente cualquier cosa que vaya a cambiar datos) divide esa acción en las actividades comerciales y envía cada una de estas actividades como mensajes a un Bus de mensajes que a su vez lo envía a las raíces agregadas respectivas para que se cuiden.
- Estas raíces agregadas pueden operar de manera completamente autónoma (buena separación de preocupaciones, gran escalabilidad, etc.)
- Una instancia de Saga en sí no contiene ninguna lógica de negocios, que está contenida en las raíces agregadas a las que envía actividades. La única 'lógica' contenida en la Saga es la lógica de 'proceso' (a menudo implementada como una máquina de estado), que determina en función de las acciones recibidas (así como los eventos de seguimiento) qué hacer (es decir, qué actividades enviar)
- Los patrones de Saga implementan una especie de patrón de transacción distribuida. Es decir: cuando una de las raíces agregadas (que de nuevo funciona de manera autónoma, sin saber de las otras existentes) falla, toda la acción podría tener que revertirse.
- Esto se implementa al tener todas las raíces agregadas, al finalizar su informe de actividad de nuevo a la Saga. (En caso de éxito y error)
- En caso de que todas las raíces agregadas devuelvan un éxito, la máquina de estado interno si la Saga determina qué hacer a continuación (o decide que está hecho)
- En caso de falla, la Saga emite a todas las raíces agregadas que participaron en la última acción una llamada Acción de Compensación, es decir: una acción para deshacer la última acción que hizo cada una de las raíces agregadas.
- Esto podría ser simplemente hacer un 'Menos 1 voto' si la acción fue "más 1 voto", pero podría ser más complicado como restaurar una publicación de blog en su versión anterior.
- El abastecimiento de eventos (consulte la publicación de blog que combina los dos) tiene como objetivo externalizar el almacenamiento de los resultados de cada una de las actividades que cada una de las raíces agregadas lleva a cabo en una Tienda de eventos centralizada (los cambios se denominan 'eventos' en este contexto)
- Esta tienda de eventos es la 'versión única de la verdad' y se puede usar para reproducir el estado de todas las entidades simplemente iterando los eventos almacenados (esencialmente como un registro de eventos)
- La combinación de los dos (es decir, dejar que las raíces agregadas utilicen el abastecimiento de eventos para externalizar el almacenamiento de sus cambios antes de informar a la Saga) permite muchas posibilidades interesantes, una de las cuales se refiere a mi pregunta ...
Sentí que necesitaba sacar esto de mi hombro, ya que es mucho de entender de una vez. Dado este contexto / mentalidad (de nuevo, corrija si está equivocado)
la pregunta: cuando una raíz agregada recibe una Acción compensatoria y si esa raíz agregada ha subcontratado sus cambios de estado utilizando el abastecimiento de eventos, ¿no sería la Acción compensatoria en todas las situaciones simplemente una eliminación del último evento en el Almacén de eventos para eso? dada la raíz agregada? (Suponiendo que la implementación persistente permite eliminaciones)
Eso tendría mucho sentido para mí (y sería otro gran beneficio de esta combinación), pero como dije, podría estar haciendo estas suposiciones basadas en una comprensión incorrecta / incompleta de estos conceptos.
Espero que esto no sea demasiado largo.
Gracias.