Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
YO !
JÉRÔME AVOUSTIN
Artisan développeur chez Saagie, Fan d'extreme
programming et de rugby.
@JeromeAvoustin
DDD
AND NODE.JS
FTW !!!
DOMAIN DRIVEN DESIGN
Alberto Brandolini (@ziobrando)
It's not stakeholder knowledge but
developers' ignorance that gets
de...
DOMAIN DRIVEN DESIGN
DOMAIN DRIVEN DESIGN
Approche de conception de systèmes complexes
Emergence d'un modèle pour représenter le
domaine cible
...
DOMAIN DRIVEN DESIGN
DOMAIN DRIVEN DESIGN
DOMAIN DRIVEN DESIGN
DOMAIN DRIVEN DESIGN
DOMAIN DRIVEN DESIGN
DOMAIN DRIVEN DESIGN
DOMAIN DRIVEN DESIGN
DOMAIN DRIVEN DESIGN
BOUNDED CONTEXTS
STRATEGIC DDD
Identification des sous-domaines
Emergence du langage omniscient et des bounded
contexts
➡ EVENT STORMING ⬅
EVENT STORMING
source: http://www.avanscoperta.it/
EVENT STORMING
source: http://www.avanscoperta.it/
TACTICAL DDD
CQRS
Command Query Responsibility Segregation
Principe d'architecture assez simple
CQRS
classe CustomerService
void MakeCustomerPreferred(CustomerId)
Customer GetCustomer(CustomerId)
CustomerSet GetCustome...
CQRS
classe CustomerWriteService
classe CustomerReadService
source:
void MakeCustomerPreferred(CustomerId)
void ChangeCust...
CQRS
Enjeux différents
Queries : indexation, aggrégation, projection
Commands : consistance
On peut aussi séparer
Les modèl...
EVENT SOURCING
Source de données immutable
Stockage de l'historique des événements (du
domaine)
EVENT SOURCING
idPotAuFeu nbCarottes nbChoux etat
42 0 0 en prépa
43 2 3 en cuisson
44 5 3 prêt
EVENT SOURCING
Commande: "Ajouter une carotte au pot au feu 42"
idPotAuFeu nbCarottes nbChoux etat
42 0 0 en prépa
43 2 3 ...
EVENT SOURCING
Commande: "Ajouter une carotte au pot au feu 42"
idPotAuFeu nbCarottes nbChoux etat
42 1 0 en prépa
43 2 3 ...
EVENT SOURCING
Commande: "Ajouter 2 choux au pot au feu 42"
idPotAuFeu nbCarottes nbChoux etat
42 1 2 en prépa
43 2 3 en c...
EVENT SOURCING
Commande: "Ajouter une carotte au pot au feu 42"
idPotAuFeu nbCarottes nbChoux etat
42 2 2 en prépa
43 2 3 ...
EVENT SOURCING
Commande: "Retirer une carotte du pot au feu 42"
idPotAuFeu nbCarottes nbChoux etat
42 1 2 en prépa
43 2 3 ...
EVENT SOURCING
Aggregate Id Event Data Version
PotAuFeu 42 préparation_lancée null 1
EVENT SOURCING
Commande: "Ajouter une carotte au pot au feu 42"
Aggregate Id Event Data Version
PotAuFeu 42 préparation_la...
EVENT SOURCING
Commande: "Ajouter 2 choux au pot au feu 42"
Aggregate Id Event Data Version
PotAuFeu 42 préparation_lancée...
EVENT SOURCING
Commande: "Ajouter une carotte au pot au feu 42"
Aggregate Id Event Data Version
PotAuFeu 42 préparation_la...
EVENT SOURCING
Commande: "Retirer une carotte du pot au feu 42"
Aggregate Id Event Data Version
PotAuFeu 42 préparation_la...
EVENT SOURCING
f(history, command) => events
EVENT SOURCING
f(history) => state
f(state, command) => events
EVENT SOURCING ET DDD
source: http://thinkbeforecoding.com/post/2014/01/04/Event-Sourcing.-Draw-it
CQRS/ES
f(state, event) => state
EVENT SOURCING
Protection/Decision
Interpretation/Projection
Ou pour traiter chaque événement
source:
f(history) => state
...
CQRS/ES
LIBS UTILISÉES
tcomb FTW !!! (typage, immutabilité)
redux-actions (reload ES)
LE CODE SOURCE
https://github.com/rehia/ddd-node- w
MERCI !
Upcoming SlideShare
Loading in …5
×

DDD implementation in Node

2,086 views

Published on

This talk has been given at Montpellier JS, in June 2017 for the first time.
This is a synthesis of different implementations, during 3 years, following a DDD approach, using Node.js, that are now live in production.
The code has been produced to be run with Node.js 8.

Published in: Technology
  • Login to see the comments

DDD implementation in Node

  1. 1. YO ! JÉRÔME AVOUSTIN Artisan développeur chez Saagie, Fan d'extreme programming et de rugby. @JeromeAvoustin
  2. 2. DDD AND NODE.JS FTW !!!
  3. 3. DOMAIN DRIVEN DESIGN Alberto Brandolini (@ziobrando) It's not stakeholder knowledge but developers' ignorance that gets deployed into production
  4. 4. DOMAIN DRIVEN DESIGN
  5. 5. DOMAIN DRIVEN DESIGN Approche de conception de systèmes complexes Emergence d'un modèle pour représenter le domaine cible Créer les conditions d'une collaboration efficace entre experts du domaine et l'équipe de réalisation
  6. 6. DOMAIN DRIVEN DESIGN
  7. 7. DOMAIN DRIVEN DESIGN
  8. 8. DOMAIN DRIVEN DESIGN
  9. 9. DOMAIN DRIVEN DESIGN
  10. 10. DOMAIN DRIVEN DESIGN
  11. 11. DOMAIN DRIVEN DESIGN
  12. 12. DOMAIN DRIVEN DESIGN
  13. 13. DOMAIN DRIVEN DESIGN
  14. 14. BOUNDED CONTEXTS
  15. 15. STRATEGIC DDD Identification des sous-domaines Emergence du langage omniscient et des bounded contexts ➡ EVENT STORMING ⬅
  16. 16. EVENT STORMING source: http://www.avanscoperta.it/
  17. 17. EVENT STORMING source: http://www.avanscoperta.it/
  18. 18. TACTICAL DDD
  19. 19. CQRS Command Query Responsibility Segregation Principe d'architecture assez simple
  20. 20. CQRS classe CustomerService void MakeCustomerPreferred(CustomerId) Customer GetCustomer(CustomerId) CustomerSet GetCustomersWithName(Name) CustomerSet GetPreferredCustomers() void ChangeCustomerLocale(CustomerId, NewLocale) void CreateCustomer(Customer) void EditCustomerDetails(CustomerDetails)
  21. 21. CQRS classe CustomerWriteService classe CustomerReadService source: void MakeCustomerPreferred(CustomerId) void ChangeCustomerLocale(CustomerId, NewLocale) void CreateCustomer(Customer) void EditCustomerDetails(CustomerDetails) Customer GetCustomer(CustomerId) CustomerSet GetCustomersWithName(Name) CustomerSet GetPreferredCustomers() http://codebetter.com/gregyoung/2010/02/16/cqrs-task-based-uis-event-sourcing-agh/
  22. 22. CQRS Enjeux différents Queries : indexation, aggrégation, projection Commands : consistance On peut aussi séparer Les modèles : normalisation VS dénormalisation Les sources de données Pattern très intéressant pour scaler
  23. 23. EVENT SOURCING Source de données immutable Stockage de l'historique des événements (du domaine)
  24. 24. EVENT SOURCING idPotAuFeu nbCarottes nbChoux etat 42 0 0 en prépa 43 2 3 en cuisson 44 5 3 prêt
  25. 25. EVENT SOURCING Commande: "Ajouter une carotte au pot au feu 42" idPotAuFeu nbCarottes nbChoux etat 42 0 0 en prépa 43 2 3 en cuisson 44 5 3 prêt
  26. 26. EVENT SOURCING Commande: "Ajouter une carotte au pot au feu 42" idPotAuFeu nbCarottes nbChoux etat 42 1 0 en prépa 43 2 3 en cuisson 44 5 3 prêt
  27. 27. EVENT SOURCING Commande: "Ajouter 2 choux au pot au feu 42" idPotAuFeu nbCarottes nbChoux etat 42 1 2 en prépa 43 2 3 en cuisson 44 5 3 prêt
  28. 28. EVENT SOURCING Commande: "Ajouter une carotte au pot au feu 42" idPotAuFeu nbCarottes nbChoux etat 42 2 2 en prépa 43 2 3 en cuisson 44 5 3 prêt
  29. 29. EVENT SOURCING Commande: "Retirer une carotte du pot au feu 42" idPotAuFeu nbCarottes nbChoux etat 42 1 2 en prépa 43 2 3 en cuisson 44 5 3 prêt
  30. 30. EVENT SOURCING Aggregate Id Event Data Version PotAuFeu 42 préparation_lancée null 1
  31. 31. EVENT SOURCING Commande: "Ajouter une carotte au pot au feu 42" Aggregate Id Event Data Version PotAuFeu 42 préparation_lancée null 1 PotAuFeu 42 carotte_ajoutée {nb:1} 2
  32. 32. EVENT SOURCING Commande: "Ajouter 2 choux au pot au feu 42" Aggregate Id Event Data Version PotAuFeu 42 préparation_lancée null 1 PotAuFeu 42 carotte_ajoutée {nb:1} 2 PotAuFeu 42 chou_ajouté {nb:2} 3
  33. 33. EVENT SOURCING Commande: "Ajouter une carotte au pot au feu 42" Aggregate Id Event Data Version PotAuFeu 42 préparation_lancée null 1 PotAuFeu 42 carotte_ajoutée {nb:1} 2 PotAuFeu 42 chou_ajouté {nb:2} 3 PotAuFeu 42 carotte_ajoutée {nb:1} 4
  34. 34. EVENT SOURCING Commande: "Retirer une carotte du pot au feu 42" Aggregate Id Event Data Version PotAuFeu 42 préparation_lancée null 1 PotAuFeu 42 carotte_ajoutée {nb:1} 2 PotAuFeu 42 chou_ajouté {nb:2} 3 PotAuFeu 42 carotte_ajoutée {nb:1} 4 PotAuFeu 42 carotte_retirée {nb:1} 5
  35. 35. EVENT SOURCING f(history, command) => events
  36. 36. EVENT SOURCING f(history) => state f(state, command) => events
  37. 37. EVENT SOURCING ET DDD source: http://thinkbeforecoding.com/post/2014/01/04/Event-Sourcing.-Draw-it
  38. 38. CQRS/ES f(state, event) => state
  39. 39. EVENT SOURCING Protection/Decision Interpretation/Projection Ou pour traiter chaque événement source: f(history) => state f(state, command) => events f(events) => state f(state, event) => state http://verraes.net/2014/05/functional-foundation-for-cqrs-event-sourcing/
  40. 40. CQRS/ES
  41. 41. LIBS UTILISÉES tcomb FTW !!! (typage, immutabilité) redux-actions (reload ES)
  42. 42. LE CODE SOURCE https://github.com/rehia/ddd-node- w
  43. 43. MERCI !

×