Eventsourcing, DDD & CQRS sont dans un bateau
- CTO Performance Immo
- Programmeur indépendant
Qui suis-je ? (vaste question)
Ce que j'aime faire
Mon boulot actuellement
@ugobourdon
Agenda
- Eventsourcing WTF ?
- Comment concevoir ses flux d'évènements avec DDD
- CQRS à la rescousse
Eventsourcing
Représenter son application comme une succession d'états
Etat 1
Etat 2
Etat 3
Inversons la polarité
E 1
E 2
E 3
Event 1-2
Event 2-3
Un petit exemple - Le panier
Panier t1
- article 1 - quantité x2 ...
- article 2 - quantité x1 ...
- ...
Panier t2
- article 1 - quantité x2 ...
- ______________
Un petit exemple - Le panier
Panier t1
- article 1 - quantité x2 ...
- article 2 - quantité x1 ...
- ...
Panier t2
- article 1 - quantité x2 ...
- ______________
article retiré du panier
{ article 2 }
1 article ajouté au panier
__________________________________
{
id: 1234,
name: article 2,
qty: 1,
...
}
1 article retiré du panier
__________________________________
{
id: 1234
}
1 article ajouté au panier
__________________________________
{
id: 3456,
name: article 1,
qty: 3,
...
}
___________________________________________________________________
>
temps
Current state
{
articles : [
article : {
id: 3456,
name: article 1,
qty: 3
}
]
}
apply
Capter l'intention de l'utilisateur
Je change d'adresse ou je déménage
Les artefacts d'un système "évènementiel"
- Command
- Event
- State
2 fonctions pour les contrôler toutes
decide :: Command -> State -> [Event]
apply :: State -> Event -> State
DECIDE
Command
[Event]
APPLY
State
Diagramme d'une boucle de rétro-action
Boite noire
Un système évènementiel c'est pareil
boite noire
Ouais c'est super mais t'es en train de nous arnaquer là !
Elle est où la base de données là ?
Tadaaa !!!
boite noire
Eventstore WTF ?
- Insertion seule
- Immutable dans le passé (1 fois écrit, ça ne change plus)
- 1 simple sérialisation des évènements
=> 1 simple queue de message
Impacts
- (Ultra) Simple à mettre en oeuvre
- L'état privé de l'application n'est plus en clair dans ma BDD
- Un système d'audit "gratuit"
- Backup | Réplication incrémentale
Voilà prez finie !
A l'attaque des cacahuètes :D
Pour pas cher je vous vends donne quelques petites recettes pour aller plus loin ;)
Domain Driven Design
Pas de panique
Notions importantes
- Value Object | Entity | Aggregate
- Bounded Context
Aggregate
1 instance d'aggrégat = 1 stream d'évènement
La transactionalité n'est respectée qu'à l'intérieur d'un aggrégat donné
=> le système est "cohérent à terme"
__________________________________________________________________
>
BoatCreated
AvailPeriodAdded
BookingMade
BookingCanceled
...
t
Boat Aggregate | Boat Stream {id: 1234}
{
aggregateUid: 1234,
name: my supa boat,
...
}
{
aggregateUid: 1234,
startDate: LocalDate,
endDate: LocalDate,
...
}
{
aggregateUid: 1234,
bookingUid: 2534,
startDate: LocalDate,
endDate: LocalDate,
price: BigDecimal
}
{
aggregateUid: 1234,
bookingUid: 2534
}
__________________________________________________________________
>
BrokerEnrolled
BoatAdded
...
t
Broker Aggregat (boat owner)
{
aggregateUid: 1234,
name: best broker,
...
}
{
aggregateUid: 1234,
boatUid: 1234
}
Héxagonal architecture
Bullshit Eventsourcing
CRUD Event
Command sourcing
Évènements métier, captant l'intention, de taille modeste
- Les règles métier vont changer !
- Les résultats des versions passées des règles ont été capturées dans les évènements émis
- L'implémentation actuelle n'a pas besoin de connaitre les anciennes règles
Bounded context
Un mot sur 'State'
boite noire
Bon c'est cool, mais ton truc c'est pas clair, en terme de perf ça à l'air bien pourri.
Et surtout, l'utilisateur lui il veut des écrans, comment on fait ?
Captain CQRS
Command & Query Responsability Segregation
(Re) Héxagonal architecture
Ouais mais les perfs ?
C'est un détail d'implémentation :D
Quelques pistes
- SNAPSHOT
- CQRS
- Lambda architecture
Conclusion
Modélisation indépendante des choix techniques
- Système d'audit "for free"
- permet de "découvrir" des relations, des infos plus tard
- projections deviennent naturelles (sync, async, offline)
Data Mining
Refactoring
- représentation de l'état réellement privée
- "separation of concern"
- changements de représentation simplifiés
Simplicité
- Rajouter une régle métier (OCP)
- Tester les règles métier
- Documenter les règles
- Discuter des règles
Pour tout cela il ne faut pas oublier
- Évènement capte l'intention (éviter le CRUD)
- Évènement contient la donnée strictement nécessaire
- Cette donnée est le résultat d'une décision (calcul)
- Évènement existe dans un "Bounded Context"
- "Sérialiseur" tolérant
Au-delà du "sourcing"
- React.js
- Functional Reactive Programming (FRP)
Crédits / ressources
Eventsourcing, DDD & CQRS sont dans un bateau
By ugobourdon
Eventsourcing, DDD & CQRS sont dans un bateau
- 3,656