Skip to content

Latest commit

 

History

History
170 lines (107 loc) · 7.28 KB

20180416_SGCIB_ES-CQRS-journey.adoc

File metadata and controls

170 lines (107 loc) · 7.28 KB

9 things that will make your ES/CQRS journey painful

Overview

De prime abord, l’Event Sourcing et CQRS ne présentent pas de complexité majeure. Et pourtant, nous sommes nombreux à avoir souffert en les implémentant de façon maladroite ou à mauvais escient.

Après avoir re-posé les bases de ces 2 patterns, je vous propose de revenir ensemble sur les 9 pièges à éviter lorsque l’on se lance dans leur implémentation.
Nous aborderons notamment les problématiques des systèmes distribués, le versionnage des évènements, la cohérence à terme, les process managers/sagas, le Domain Driven Design et l’Event Storming.

CQRS : permettre la lecture sans impacter le métier (écriture)

Les 9 pièges

L’utilisation de frameworks

Pas la meilleure chose à faire pour commencer.
Il faut être capable de faire des compromis (latence, haut débit, etc.), ce que ne permettent pas forcément, ou facilement, les frameworks.

Persist commands instead of persist events

Lors d’un rejeu, à rejouer la fonction d’évolution ("Command"), on peut être victime d’effets de bord.

📎
Je trouve cet article de Xebia très clair sur ce point.
⚠️
Il semblerait que Martin Fowler, dans son article sur le sujet, mélange un peu command et event. D’où les mises en garde de Jérémie CHASSAING.

Think of ES/CQRS as top-level architecture

ES/CQRS are not silver bullets :

  • montée en compétence non négligeable

  • l’ES est coûteux à mettre en place

  • la mise en place de l’ES et du CQRS implique la création de beaucoup de petits éléments (difficultés de debugging)

Consider ES/CQRS only to be a technical stuff

Le choix principal qui doit amener l’Event Sourcing doit être le métier.

Domain Driven Design

Comment faire ? → le DDD ! (une façon de faire)
Le DDD doit être utilisé pour des workflows / process métiers complexes (pas la peine de le sortir pour un simple CRUD), sur des sujets amenés à durer (et donc à justifier l’investissement initial)

Le DDD doit permettre :

  • de créer un ubiquitous language avec le métier

  • la création d’un Domain Model

  • de définir les entities (object qui a une identité arbitraire : sert à nous identifier indépendamment de nos attributs)

  • de définir des value objects : l’opposé des entities, sont caractérisés par leurs attributs, et non ce qu’ils sont.

  • de définir des aggregates : définit une frontière autour d’un ensemble d’objets, et est le point d’entrée permettant de manipuler les objets contenus

Bounded Contexts = Domain Model \+ Ubiquitous language

Event Storming

Atelier dans lequel on rassemble IT et métier dans le but de découvrir l’ubiquitous language.

  1. On donne des post-its à tout le monde, et on demande au métier de raconter une histoire à partir des évènements.
    Il va donc falloir placer les post-its (events) par ordre chronologique sur le mur.

    • 1 des objectifs est d’identifier les hot-spots (éléments métier centraux)

    • Ensuite, on recherche les évènements qui déclenchent des évènements.

    • on va ensuite chercher à regrouper les aggregates par bounded contexts

20180416 ES CQRS journey 01
⚠️
L’atelier peut faire ressortir des grosses différences de vision → la présence d’un facilitateur est vivement recommandée.
Il va laisser les choses sortir au début, puis va recentrer les choses.

Voir la doc d’Alberto Brandolini "introducing Event Storming" (checker son site à ce sujet)

Do not embrace eventual consistency (cohérence à terme)

On va limiter le scope de la transaction à la seule aggregate, et non la projection.

La réalité côté cohérence à terme est de réagir (on ne peut pas de façon réaliste tout prévoir à l’avance)

To be unaware of events evolution

Greg Young est en train de finir un livre en ligne sur le sujet.

20180416 ES CQRS journey 02
  • Importance de l’utilisation d’un format adapté : Avro, Protobuf

  • Utiliser une gestion de contrat permettant la retro-compatibilité

Penser à protéger les bounded contexts avec un couche d’anti-corruption (ACL)

Ignore the 4 challenges of messaging systems

20180416 ES CQRS journey 03
  • lost messages

  • duplicated messages

  • out-of-order messages

  • unprocessed messages

📎
Rappel
consommateur idempotent : sait gérer plusieurs fois le même message

Not to be able to easily switch any piece of technology

20180416 ES CQRS journey 04

L’implémentation de l’Event Store ne doit pas dépendre de la technologie sous-jacente.

Exemple : Kafka est peut-être une bonne solution aujourd’hui, mais qu’en sera-t-il dans 5 ans ?
→ Une map en mémoire pourrait très bien faire l’affaire.

Même remarque pour la techno des projections, qui sont, par principe, volatiles (on peut les reconstruire via les events)

Lack of Process managers and sagas

  • Process managers : son rôle est de coordonner des messages entre différents aggregates (je coordonne).
    Se représente bien par une machine à état.

20180416 ES CQRS journey 05

Le coût est que le process manager doit être persisté (comme il y a une notion d’état sous-jacent).

  • Sagas : permet de remplacer une transaction distribuée entre plusieurs aggregates.
    Est bien représenté par une transaction compensatoire (qui remplace donc la transaction distribuée)

20180416 ES CQRS journey 06

BONUS ! 10e piège : être dogmatique

Il n’y a pas qu’une seule manière de faire de l’event sourcing

Toujours chercher à faire des compromis (éclairés bien sûr…​), et être capable de les revoir.

Conclusion

Dans les conférences en général, il y a souvent un amalgame entre CQRS et Event Sourcing, mais il s’agit bien de 2 éléments différents.
Il y a 2 ans (?) Thomas PIERRAIN avait présenté le CQRS seul, sans l’Event Sourcing.

Pour faire monter en compétence les nouveaux, un conseil : pairer pairer pairer

Ne pas oublier les Architecture Decision Record, qui permettent de lister les décisions d’architecture avec leurs justifications, et qui doivent pouvoir se trouver rapidement (le mieux serait d’être capable de les rendre accessibles via les repos GitHub)