Coding Dojo EventSourcing 
CARA Lyon – 21 octobre 2014 – Hébergé par l’INSA
A venir dans vos communautés… 
23/10 : Tests avec TFS 
04/11 : CARA Lyon 
15/11 : Global Day of CodeRetreat, journée entière le samedi 
18/11 : Human Talks 
25/11 : Coding Dojo => sujet à discuter sur 
https://groups.google.com/forum/#!forum/cara-dojo, approches des 
différents frameworks ? (xSpec, Gherkin, xxxUnit) 
Et encore plus sur http://lyontechhub.org
Le sujet du jour… 
Suite à la session de Jérémie Chassaing (@thinkb4coding) au MUGLyon, 
mettons en pratique l’Event Sourcing sur le jeu du Uno. 
Quelques règles de bases du Uno : 
• Démarrer une partie avec au moins 3 joueurs 
• Jouer une carte à son tour (même couleur ou même numéro) 
• Pour aller plus loin : gérer les cartes spéciales (changement de 
sens…), gérer les malus en cas d’erreur (Event plutôt qu’exception)
Quelques clés de l’EventSourcing 
Conserver la succession d’événements métier PLUTÔT QUE l’état actuel du système 
• /! Command Sourcing 
Définir des événements métier (Event) autour d’AggregateRoot générés à partir de 
Command (atelier EventStorming, 6 code smells) => lien avec le DDD 
Reconstruire l’état actuel à partir de la suite d’événements passés 
Lien avec CQRS (Command Query Responsability Seggregation): on n’utilise pas 
forcément le modèle à base d’EventSourcing pour les opérations de lecture (Query) 
=> opérations de projection des événements dans un modèle de lecture spécifique
Un schéma plutôt que des mots… 
« Decide » Command Events 
« Apply » 
EventStore 
State 
Event Sourcing 
CQRS 
« Project » 
SGBD 
Query Base NoSQL
A vous de jouer… 
1. AggregateRoot Game, Command StartGame, Event GameStarted => 
« fonction Decide » + EventStore (stockage en mémoire) 
> Comment passer les événements de l’AggregateRoot à l’EventStore, 
sachant que ce n’est qu’un écouteur parmi d’autres des Events levés ? 
> Pistes : AggregateRoots.GetEvents, DomainEvent.Raise, autres ? 
2. Command PlayCard, Event CardPlayed + exceptions => 
« fonction Apply » 
3. Chargement d’un Aggregat à partir des événements 
4. Gestion de la concurrence, de cas plus complexes (cartes spéciales, 
Event au lieu d’exceptions…), changement de support de stockage 
(GetEventStore…)
Feedback 
MERCI !
Quelques références 
En C# : https://github.com/gregoryyoung/m-r, 
En F# : https://github.com/thinkbeforecoding/FsUno, 
http://thinkbeforecoding.github.io/FsUno.Prod/ 
En PHP : https://github.com/beberlei/litecqrs-php, 
https://github.com/qandidate-labs/broadway 
En Java : http://www.jayway.com/2013/03/08/aggregates-event-sourcing- 
distilled/ ? 
En Ruby : https://github.com/slashdotdash/rcqrs ? 
En Scala : https://github.com/eligosource/eventsourced-example ?

20141021 - Coding dojo EventSourcing

  • 1.
    Coding Dojo EventSourcing CARA Lyon – 21 octobre 2014 – Hébergé par l’INSA
  • 2.
    A venir dansvos communautés… 23/10 : Tests avec TFS 04/11 : CARA Lyon 15/11 : Global Day of CodeRetreat, journée entière le samedi 18/11 : Human Talks 25/11 : Coding Dojo => sujet à discuter sur https://groups.google.com/forum/#!forum/cara-dojo, approches des différents frameworks ? (xSpec, Gherkin, xxxUnit) Et encore plus sur http://lyontechhub.org
  • 3.
    Le sujet dujour… Suite à la session de Jérémie Chassaing (@thinkb4coding) au MUGLyon, mettons en pratique l’Event Sourcing sur le jeu du Uno. Quelques règles de bases du Uno : • Démarrer une partie avec au moins 3 joueurs • Jouer une carte à son tour (même couleur ou même numéro) • Pour aller plus loin : gérer les cartes spéciales (changement de sens…), gérer les malus en cas d’erreur (Event plutôt qu’exception)
  • 4.
    Quelques clés del’EventSourcing Conserver la succession d’événements métier PLUTÔT QUE l’état actuel du système • /! Command Sourcing Définir des événements métier (Event) autour d’AggregateRoot générés à partir de Command (atelier EventStorming, 6 code smells) => lien avec le DDD Reconstruire l’état actuel à partir de la suite d’événements passés Lien avec CQRS (Command Query Responsability Seggregation): on n’utilise pas forcément le modèle à base d’EventSourcing pour les opérations de lecture (Query) => opérations de projection des événements dans un modèle de lecture spécifique
  • 5.
    Un schéma plutôtque des mots… « Decide » Command Events « Apply » EventStore State Event Sourcing CQRS « Project » SGBD Query Base NoSQL
  • 6.
    A vous dejouer… 1. AggregateRoot Game, Command StartGame, Event GameStarted => « fonction Decide » + EventStore (stockage en mémoire) > Comment passer les événements de l’AggregateRoot à l’EventStore, sachant que ce n’est qu’un écouteur parmi d’autres des Events levés ? > Pistes : AggregateRoots.GetEvents, DomainEvent.Raise, autres ? 2. Command PlayCard, Event CardPlayed + exceptions => « fonction Apply » 3. Chargement d’un Aggregat à partir des événements 4. Gestion de la concurrence, de cas plus complexes (cartes spéciales, Event au lieu d’exceptions…), changement de support de stockage (GetEventStore…)
  • 7.
  • 8.
    Quelques références EnC# : https://github.com/gregoryyoung/m-r, En F# : https://github.com/thinkbeforecoding/FsUno, http://thinkbeforecoding.github.io/FsUno.Prod/ En PHP : https://github.com/beberlei/litecqrs-php, https://github.com/qandidate-labs/broadway En Java : http://www.jayway.com/2013/03/08/aggregates-event-sourcing- distilled/ ? En Ruby : https://github.com/slashdotdash/rcqrs ? En Scala : https://github.com/eligosource/eventsourced-example ?