Je me rends compte que la question ci-dessus soulève probablement quelques «quoi», mais laissez-moi essayer d'expliquer:
J'essaie d'envelopper ma tête sur quelques concepts connexes, essentiellement le modèle Saga ( http://www.rgoarchitects.com/Files/SOAPatterns/Saga.pdf ) en combinaison avec Event-sourcing (Un concept DDD : http://en.wikipedia.org/wiki/Domain-driven_design )
Un bon article qui le regroupe: https://blog.jonathanoliver.com/cqrs-sagas-with-event-sourcing-part-ii-of-ii/
J'arrive à la question dans une minute, mais je pense que je dois essayer de résumer ce que je comprends d'abord (ce qui pourrait bien être faux, alors veuillez corriger si c'est le cas) car cela pourrait bien avoir un impact sur la raison pour laquelle je suis poser la question pour commencer:
- Le modèle Saga est une sorte de courtier qui, étant donné une action (utilisateur final, automatisé, etc. essentiellement tout ce qui va changer les données), divise cette action en activités commerciales et envoie chacune de ces activités sous forme de messages à un bus de messages qui à son tour l'envoie aux racines agrégées respectives à prendre en charge.
- Ces racines agrégées peuvent fonctionner de manière totalement autonome (belle séparation des préoccupations, grande évolutivité, etc.)
- Une instance Saga elle-même ne contient aucune logique métier, qui est contenue dans les racines agrégées auxquelles elle envoie des activités. La seule «logique» contenue dans la saga est la logique de «processus», (souvent implémentée comme une machine à états), qui détermine en fonction des actions reçues (ainsi que des événements de suivi) ce qu'il faut faire (c'est-à-dire: quelles activités envoyer)
- Les modèles Saga implémentent une sorte de modèle de transaction distribuée. C'est-à-dire: lorsque l'une des racines agrégées (qui fonctionnent à nouveau de manière autonome, sans se connaître mutuellement) échoue, l'action entière peut devoir être annulée.
- Ceci est mis en œuvre en ayant toutes les racines agrégées, à la fin de leur rapport d'activité à la Saga. (En cas de succès ainsi que d'erreur)
- Dans le cas où toutes les racines agrégées retournent un succès, la statemachine interne si la Saga détermine quoi faire ensuite (ou décide que c'est fait)
- En cas d'échec, la Saga envoie à toutes les racines agrégées qui ont participé à la dernière action une action dite de compensation, c'est-à-dire: une action pour annuler la dernière action effectuée par chacune des racines agrégées.
- Cela pourrait simplement faire un «vote moins 1» si l'action était «plus 1 vote», mais cela pourrait être plus compliqué comme restaurer un blog à sa version précédente.
- L'événementiel (voir le blog combinant les deux) vise à externaliser la sauvegarde des résultats de chacune des activités que chacune des racines agrégées entreprend dans un magasin d'événements centralisé (les changements sont appelés «événements» dans ce contexte)
- Ce magasin d'événements est la «version unique de la vérité» et peut être utilisé pour rejouer l'état de toutes les entités simplement en itérant les événements stockés (essentiellement comme un journal des événements)
- La combinaison des deux (c.-à-d. Laisser les racines agrégées utiliser Event-sourcing pour externaliser la sauvegarde de leurs modifications avant de rendre compte à la Saga) offre de nombreuses possibilités intéressantes, dont l'une concerne ma question ...
Je sentais que je devais retirer cela de mon épaule, car c'est beaucoup à saisir en une seule fois. Compte tenu de ce contexte / état d'esprit (encore une fois, veuillez corriger si vous avez tort)
la question: lorsqu'une racine agrégée reçoit une action de compensation et si cette racine agrégée a externalisé ses changements d'état à l'aide de la source d'événements, l'action de compensation dans toutes les situations ne serait-elle pas simplement une suppression du dernier événement du magasin d'événements pour cela compte tenu de la racine globale? (En supposant que la mise en œuvre persistante autorise les suppressions)
Cela aurait beaucoup de sens pour moi (et serait un autre grand avantage de cette combinaison), mais comme je l'ai dit, je pourrais faire ces hypothèses sur la base d'une compréhension incorrecte / incomplète de ces concepts.
J'espère que cela n'a pas été trop long.
Merci.