Tech'n bolts home about archive // tbd-in-practice ddd // (drafts)
{ version:1.3, what:["java", "scala", "nosql", "amqp", "programing", "functional", "[t|b|d]dd", ...] }

L'Event sourcing c'est quoi?

Martin Fowler décrit l’Event Sourcing comme:

Captures all changes to an application state as a sequence of events.

En bref, au lieu de conserver le dernier état d’un objet, on conserve toutes les transitions qui ont amené à cet état. En conservant l’ensemble de ces transitions, il est ainsi possible de rejouer les différents états pris par l’objet au cours de son cycle de vie. Plus important encore, ce n’est pas seulement le changement d’état qui est conservé, mais l’intention de l’utilisateur qui a provoqué ce changement.

Supposons que l’on se promène sur amazon. A chaque fois que l’on tombe sur un livre qui nous plait, on l’ajoute à notre panier. Au bout d’un moment, notre panier pourrait ressembler à cela:

[
  "Domain-Driven Design: Tackling Complexity in the Heart of Software",
  "Applying Domain-Driven Design and Patterns: With Examples in C# and .NET",
  "Event Centric: Finding Simplicity in Complex Systems",
  "Streamlined Object Modeling: Patterns, Rules, and Implementation"
]

Quand on se décide finalement à passer notre commande, oh stupeur! on en a pour $201.20. Notre budget ne le permettant pas, après une sélection drastique, notre panier se déleste de deux livres et devient:

[
  "Domain-Driven Design: Tackling Complexity in the Heart of Software",
  "Streamlined Object Modeling: Patterns, Rules, and Implementation"
]

Le montant s’élève alors à $97.66, ce qui est acceptable pour notre budget actuel. La commande passée, il ne reste plus rien des deux livres que nous souhaitions acheter et que nous avons dû mettre de côté faute de moyen.

Si maintenant, on conserve l’intégralité des changements d’états, l’historique de notre panier (vu d’un point de vue technique) pourrait être similaire à:

[
  BookAdded ("Domain-Driven Design: Tackling Complexity in the Heart of Software"),
  BookAdded ("Patterns of Enterprise Application Architecture"),
  BookAdded ("Applying Domain-Driven Design and Patterns: With Examples in C# and .NET"),
  BookRemoved ("Patterns of Enterprise Application Architecture"),
  BookAdded ("Event Centric: Finding Simplicity in Complex Systems"),
  BookAdded ("Streamlined Object Modeling: Patterns, Rules, and Implementation"),
  BookRemoved ("Event Centric: Finding Simplicity in Complex Systems"),
  BookRemoved ("Streamlined Object Modeling: Patterns, Rules, and Implementation")
]

En conservant, l’ensemble des changements d’états on se rend compte que le livre “Patterns of Enterprise Application Architecture” a fait une apparition aussi dans le panier, ainsi que les deux livres enlevés à la fin.

Maintenant en conservant l’historique des intentions de l’utilisateurs on obtient:

[
  BookAdded ("Domain-Driven Design: Tackling Complexity in the Heart of Software"),
  PeopleAlsoBought ("Patterns of Enterprise Application Architecture"),
  BookAdded ("Patterns of Enterprise Application Architecture"),
  PeopleAlsoBought ("Applying Domain-Driven Design and Patterns: With Examples in C# and .NET"),
  BookAdded ("Applying Domain-Driven Design and Patterns: With Examples in C# and .NET"),
  BookRemoved ("Patterns of Enterprise Application Architecture"),
  Search ("event centric"),
  BookAdded ("Event Centric: Finding Simplicity in Complex Systems"),
  BookAdded ("Streamlined Object Modeling: Patterns, Rules, and Implementation"),
  BookRemovedOnBilling ("Event Centric: Finding Simplicity in Complex Systems"),
  BookRemovedOnBilling ("Streamlined Object Modeling: Patterns, Rules, and Implementation")
]

On peux désormais constater que les deux derniers livres ont été enlevés du panier au moment du paiement.

D’autre part, on constate que le choix de certains livres a été fait en cliquant sur les livres présentés dans la section “Les clients ayant acheté cet article ont également acheté”, ce qui renforce l’interêt de cette section. Ceci est très instructifs, et va permettre de cibler les prochaines suggestions d’achats en privilégiant ces livres. En effet, s’ils ont déjà suscité de l’interêt jusqu’au moment de l’achat, il est fort probable que cela se reproduise.

Ce qui est interessant, c’est que même si l’on ne dispose pas encore de notre mécanique de suggestions ou de nos outils d’analyse, l’information est présente et pourra être analysée lorsque nous aurons les outils adéquats.

D’autre part, on dispose de toutes les informations pour “rejouer” la constitution de notre panier, notre modèle est beaucoup plus riche que précédement et peux permettre une bien plus grande flexibilité. En effet, on a pu ajouter les évènements PeopleAlsoBought et Search sans que cela ait d’impact sur la constitution finale de notre panier.

Enfin, l’un des points les plus importants est que l’état final de notre panier importe peu. Cet état n’a plus besoin d’être conservé, puisqu’il est possible de le reconstruire à partir des évènements qui le décrivent. Chaque évènement décrit une transition vers l’état a atteindre. En conservant uniquement les évènements, il est possible de reconstruire l’objet.

Fork me on GitHub