Eventsourcing, DDD & CQRS sont dans un bateau

Qui suis-je ? (vaste question)

Ce que j'aime faire

Mon boulot actuellement

@ugobourdon

Agenda

  1. Eventsourcing WTF ?
  2. Comment concevoir ses flux d'évènements avec DDD
  3. 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