Upgrade to Pro — share decks privately, control downloads, hide ads and more …

CQRS De la théorie à la pratique

CQRS De la théorie à la pratique

Séduisante sur le papier, nous avons pu confronter cette architecture à des problématiques bien réelles lors de l'implémentation d'une brique de gestion de stock. Nous vous proposons un retour d'expérience sur les obstacles et leurs solutions (transactionnalité, concurrence, résilience, gestion du synchronisme, ...) ainsi que sur les nombreux avantages et opportunités que nous avons tirés de cette architecture.

Nicolas Le Nardou

November 23, 2015
Tweet

More Decks by Nicolas Le Nardou

Other Decks in Technology

Transcript

  1. CQRS
    DE LA THÉORIE À LA PRATIQUE

    View full-size slide

  2. HELLO WORLD !

    View full-size slide

  3. CONTEXTE PROJET
    Refondre la gestion des différents compteurs de stock
    Retail
    SAV
    Magasins
    ...

    View full-size slide

  4. CONTEXTE : ARCHITECTURE ACTUELLE DU SI
    SI monolithique en cours
    de migration
    Approche WOA
    Découplage applicatif
    Broker AMQP
    Communication orientée
    événements

    View full-size slide

  5. OBJECTIFS / PROBLÉMATIQUES
    Sécurisation / fiabilisation
    Traçabilité
    Optimisation des calculs
    de dispo

    View full-size slide

  6. CQRS
    DID YOU MEAN CARS ?

    View full-size slide

  7. COMMAND QUERY RESPONSIBILITY
    SEGREGATION
    Query ≈ read only
    Command ≈ write only
    Dans un système classique, 90% de queries pour 10% de
    commandes
    SÉPARONS LES !

    View full-size slide

  8. COMMAND QUERY RESPONSIBILITY
    SEGREGATION

    View full-size slide

  9. COMMAND QUERY RESPONSIBILITY
    SEGREGATION
    On peut optimiser ces couches indépendamment

    View full-size slide

  10. EVENT SOURCING
    Pattern de stockage des données
    On ne stocke plus l'état final mais
    les modifications
    Capacité de reconstruire tous les
    états intermédiaires
    Log gratuit et fiable

    View full-size slide

  11. POUR ALLER PLUS LOIN SUR CQRS
    Agrégats, bounded contexts, projections, eventual consistency,
    etc. ...
    https://www.parleys.com/tutorial/distributed-ddd-cqrs-et-
    eventsourcing-1-3

    View full-size slide

  12. MISE EN OEUVRE DE CQRS

    View full-size slide

  13. MISE EN OEUVRE DE CQRS
    Instancier l'architecture
    Définir les agrégats
    Identifier les commandes et les événements

    View full-size slide

  14. ARCHITECTURE

    View full-size slide

  15. AGRÉGAT
    C'est l'ensemble des compteurs
    d'un produit
    Atomicité naturelle des
    mouvements de type "Transfert"

    View full-size slide

  16. COMMANDES ET ÉVÉNEMENTS

    View full-size slide

  17. REAL LIFE PROBLEMS

    View full-size slide

  18. PB #1
    SYNCHRONISME

    View full-size slide

  19. CAS FONCTIONNEL
    L'avancement dans le workflow de
    commande client dépend de la
    capacité à déstocker
    Evénement "Déstocke si tu peux"

    View full-size slide

  20. CONFUSION SYNCHRONE / RÉPONSE
    Commande qui renvoie une
    réponse ... arf
    Côté appli cliente, on a besoin de la
    réponse pour continuer le
    traitement
    Besoin d'une réponse, oui ... mais
    pas forcément synchrone !

    View full-size slide

  21. TRACKING NUMBER
    Emission par l'application de
    stock, d'un message de statut
    après le traitement d'une
    commande
    Uniquement si la commande
    contenait un header de tracking
    (uuid)

    View full-size slide

  22. ADAPTATION DU WORKFLOW CLIENT

    View full-size slide

  23. PB #2
    ACCÈS CONCURRENTIELS

    View full-size slide

  24. PROBLÉMATIQUE
    Plusieurs commandes client veulent déstocker le même produit

    View full-size slide

  25. RÉSISTE, PROUVE QUE TU EXISTES !
    Tout le traitement d'une
    commande CQRS se fait en RAM
    Un événement n'a d'existence
    qu'une fois enregistré dans l'event
    store
    Persistence atomique

    View full-size slide

  26. PLAYHEAD
    Les événements sont numérotés
    (playhead)
    Contrainte d'unicité sur le playhead
    Ce N'est PAS un auto-incrément !

    View full-size slide

  27. DIE AND RETRY
    En cas de conflit (contrainte d'unicité), on rééxécute la
    commande

    View full-size slide

  28. WHILE(TRUE)
    class RetryOnEventConflictAction :

    View full-size slide

  29. ET SI ON TESTAIT UNITAIREMENT NOS ACCÈS
    CONCURRENTIELS ?

    View full-size slide

  30. PB #3
    TRANSACTION

    View full-size slide

  31. PROBLÉMATIQUE
    Prélever un ensemble de produits pour
    préparer la commande d'un client
    Transaction multi-agrégats

    View full-size slide

  32. ZE SOLUTION : ALGORITHME

    View full-size slide

  33. INTERNAL EVENTS
    Evénements "techniques", internes à l'application
    Présents dans l'event store
    Filtrés dans les UI utilisateurs
    Compteur "réservé"

    View full-size slide

  34. MISE EN OEUVRE

    View full-size slide

  35. https://joind.in/15267

    View full-size slide