Advertisement
Advertisement

Andrej Slivko "CQRS praktikoje"

  1. CQRS praktikoje Andrej Slivko 1
  2. Mano CQRS patirtis • Susidomėjau 2010 • Išbandžiau praktikoje 2011-2013 • Kas yra CQRS? • Kam teko dalyvauti projektuose su CQRS architektūra? • CQRS, problemos, privalumai 2
  3. Command Query Responsibility Segregation • Komandų ir užklausų atsakomybės atskyrimas • Priekaištas CRUD’ui • Praktinis įgyvendinimo pavyzdys 3
  4. Command 4 Pagrindiniai terminai
  5. Command Aggregate 5 Pagrindiniai terminai
  6. Command Aggregate Root Entity 6 Pagrindiniai terminai
  7. Command Aggregate Root Entity 7 Pagrindiniai terminai
  8. Command Aggregate Aggregate root 8 Pagrindiniai terminai
  9. Command “Sukurti vartotoją” Aggregate “Vartotojo profilis” Vartotojas (Aggregate root) Addr. CC 9 Pagrindiniai terminai
  10. Command “Sukurti vartotoją” Aggregate “Vartotojo profilis” Vartotojas (Aggregate root) Addr. CC 1 n 1 n Atomic unit 10 Pagrindiniai terminai
  11. Command “Sukurti vartotoją” Aggregate “Vartotojo profilis” Vartotojas (Aggregate root) Addr. CC 1 n 1 n Atomic unit 11 Pagrindiniai terminai
  12. Command “Sukurti vartotoją” Aggregate “Vartotojo profilis” Vartotojas (Aggregate root) Addr. CC 1 n 1 n Atomic unit 12 Pagrindiniai terminai
  13. Command “Sukurti vartotoją” Events “Vartotojas sukurtas” Events “Vartotojas sukurtas” Events “Vartotojas sukurtas” Aggregate “Vartotojo profilis” Vartotojas (Aggregate root) Addr. CC 1 n 1 n 13 Pagrindiniai terminai
  14. Command “Sukurti vartotoją” Events “Vartotojas sukurtas” Events “Vartotojas sukurtas” Events “Vartotojas sukurtas” Aggregate “Vartotojo profilis” Vartotojas (Aggregate root) Addr. CC 1 n 1 n 14 Pagrindiniai terminai
  15. Client PVZ. 15
  16. Command “Sukurti vartotoją” Client 16
  17. Command handlers Command “Sukurti vartotoją” Client 17
  18. Command handlers Command “Sukurti vartotoją” Client Event/Aggregate DB 18
  19. Command handlers Command “Sukurti vartotoją” Client Event/Aggregate DB Aggregate Vartotojas (Aggregate root) Addr. CC 1 n 1 n 19
  20. Command handlers Command “Sukurti vartotoją” Client Event/Aggregate DB Aggregate Vartotojas (Aggregate root) Addr. CC 1 n 1 n 20
  21. Command handlers Command “Sukurti vartotoją” Client Event/Aggregate DB Aggregate Vartotojas (Aggregate root) Addr. CC 1 n 1 n 21
  22. Command handlers Command “Sukurti vartotoją” Client Event/Aggregate DB Aggregate Vartotojas (Aggregate root) Addr. CC 1 n 1 n Events “Vartotojas sukurtas” Events “Vartotojas sukurtas” Events “Vartotojas sukurtas” 22
  23. Command handlers Command “Sukurti vartotoją” Client Event/Aggregate DB Aggregate Vartotojas (Aggregate root) Addr. CC 1 n 1 n Events “Vartotojas sukurtas” Events “Vartotojas sukurtas” Events “Vartotojas sukurtas” 23
  24. Command handlers Command “Sukurti vartotoją” Client Event/Aggregate DB Aggregate Vartotojas (Aggregate root) Addr. CC 1 n 1 n Events “Vartotojas sukurtas” Events “Vartotojas sukurtas” Events “Vartotojas sukurtas” Publish events 24
  25. Command handlers Command “Sukurti vartotoją” Client Event/Aggregate DB Aggregate Vartotojas (Aggregate root) Addr. CC 1 n 1 n Events “Vartotojas sukurtas” Events “Vartotojas sukurtas” Events “Vartotojas sukurtas” Publish events Event handlers 25
  26. Command handlers Command “Sukurti vartotoją” Client Event/Aggregate DB Aggregate Vartotojas (Aggregate root) Addr. CC 1 n 1 n Events “Vartotojas sukurtas” Events “Vartotojas sukurtas” Events “Vartotojas sukurtas” Publish events Event handlers 26 User name Main address Main CC Andrius Sukilėlių g. 45 32423 Juozas Utenos g. 12 63575 Petras Klevo g. 114 83465
  27. Event handlers Command handlers Command “Sukurti vartotoją” Client Event/Aggregate DB Aggregate Vartotojas (Aggregate root) Addr. CC 1 n 1 n Events “Vartotojas sukurtas” Events “Vartotojas sukurtas” Events “Vartotojas sukurtas” Publish events Query DB Update query model 27 User name Main address Main CC Andrius Sukilėlių g. 45 32423 Juozas Utenos g. 12 63575 Petras Klevo g. 114 83465
  28. Event handlers Command handlers Command “Sukurti vartotoją” Client Event/Aggregate DB Aggregate Vartotojas (Aggregate root) Addr. CC 1 n 1 n Events “Vartotojas sukurtas” Events “Vartotojas sukurtas” Events “Vartotojas sukurtas” Publish events Query DB Update query model Integrate with 3rd party 28 User name Main address Main CC Andrius Sukilėlių g. 45 32423 Juozas Utenos g. 12 63575 Petras Klevo g. 114 83465
  29. Event handlers Command handlers Command “Sukurti vartotoją” Client Event/Aggregate DB Aggregate Vartotojas (Aggregate root) Addr. CC 1 n 1 n Events “Vartotojas sukurtas” Events “Vartotojas sukurtas” Events “Vartotojas sukurtas” Publish events Query DB Update query model Send emails Integrate with 3rd party 29 User name Main address Main CC Andrius Sukilėlių g. 45 32423 Juozas Utenos g. 12 63575 Petras Klevo g. 114 83465
  30. Event handlers Command handlers Command “Sukurti vartotoją” Client Event/Aggregate DB Aggregate Vartotojas (Aggregate root) Addr. CC 1 n 1 n Events “Vartotojas sukurtas” Events “Vartotojas sukurtas” Events “Vartotojas sukurtas” Publish events Query DB Update query model Send emails Integrate with 3rd party etc. 30 User name Main address Main CC Andrius Sukilėlių g. 45 32423 Juozas Utenos g. 12 63575 Petras Klevo g. 114 83465
  31. Event handlers Command handlers Command “Sukurti vartotoją” Client Event/Aggregate DB Aggregate Vartotojas (Aggregate root) Addr. CC 1 n 1 n Events “Vartotojas sukurtas” Events “Vartotojas sukurtas” Events “Vartotojas sukurtas” Publish events Query DB Update query model Send emails Integrate with 3rd party etc. 31 User name Main address Main CC Andrius Sukilėlių g. 45 32423 Juozas Utenos g. 12 63575 Petras Klevo g. 114 83465
  32. Event handlers Command handlers Command “Sukurti vartotoją” Events “Vartotojas sukurtas” Events “Vartotojas sukurtas” Events “Vartotojas sukurtas” Event/Aggregate DB Publish events Send emails Integrate with 3rd party etc. Query DB Update query model Aggregate Vartotojas (Aggregate root) Addr. CC 1 n 1 n Client 32 User name Main address Main CC Andrius Sukilėlių g. 45 32423 Juozas Utenos g. 12 63575 Petras Klevo g. 114 83465
  33. Event handlers Command handlers Command “Sukurti vartotoją” Events “Vartotojas sukurtas” Events “Vartotojas sukurtas” Events “Vartotojas sukurtas” Event/Aggregate DB Publish events Send emails Integrate with 3rd party etc. Query DB Update query model Aggregate Vartotojas (Aggregate root) Addr. CC 1 n 1 n Client Facade 33 User name Main address Main CC Andrius Sukilėlių g. 45 32423 Juozas Utenos g. 12 63575 Petras Klevo g. 114 83465
  34. Event handlers Command handlers Command “Sukurti vartotoja” Events “Vartotojas sukurtas” Events “Vartotojas sukurtas” Events “Vartotojas sukurtas” Event/Aggregate DB Publish events Send emails Integrate with 3rd party etc. Query DB Update query model Aggregate Vartotojas (Aggregate root) Addr. CC 1 n 1 n Client Facade C 34 User name Main address Main CC Andrius Sukilėlių g. 45 32423 Juozas Utenos g. 12 63575 Petras Klevo g. 114 83465 Q
  35. Klausimai dėl CQRS architektūros? 35
  36. Event handlers Command handlers Command “Sukurti vartotoją” Events “Vartotojas sukurtas” Events “Vartotojas sukurtas” Events “Vartotojas sukurtas” Event/Aggregate DB Publish events Send emails Integrate with 3rd party etc. Query DB Update query model Aggregate Vartotojas (Aggregate root) Addr. CC 1 n 1 n Client Facade User name Main address Main CC Andrius Sukilėlių g. 45 32423 Juozas Utenos g. 12 63575 Petras Klevo g. 114 83465 36 1 2 3 4 5 6 7 8 9 10
  37. Problemos 1. Nėra įrankių 2. Daug boilerplate kodo 3. Per daug architektūros nuo pat pradžių 4. UI negalima lengvai nustatyti, kada query modelis buvo atnaujintas 5. Tradicinis UI ir CQRS turi nesuderinamumų 6. Commandos ir eventai dažnai būna arba per smulkūs, arba per stambūs 7. Sunku refactorint/migruoti Commandų, Aggregatų, Eventų pakeitimus 8. AR ir EH turėtų būti suprogramuoti “pure functions” principu, o tą sunku padaryti 37
  38. Problemos 2 9. „More than once delivery“, idempotencijos problema 10. Unikalumo užtikrinimas 11. Eventų eiliškumo svarba 12. Sufailinusių commandų/eventų administravimas 13. Eventų versijavimas 14. Veiksmų koordinavimas tarp skirtingų AR (tranzakcijos nebuvimas, Saga?) 15. AR merge/split 16. Nepavyks taisyti sistemos būsenos tiesiai production DB (bent jau be savo toolingo) 17. Sudėtingumas 38
  39. Privalumai (kuriuos patyriau asmeniškai) 1. Programuotojo tobulėjimas (projekto sudėtingumo sąskaita) 2. Query DB yra lengvai perkuriama 3. Lengva pridėti naujų agreguotų viewsų 4. Agregatas gali būti bet kokiu .Net objektu 5. Priverčia mąstyti apie data flow per sistemą 6. Messaging ir Queue pažinimas 7. CQRS atrodė rimta mano CV 2012 metais  8. Galima atsisakyti gigantiškų ir sudėtingų SQL querių ir indexų 9. Galima rinktis bet kokią DB technologiją tiek read, tiek ir write modeliams (bet geriau imti SQL) 39
  40. Privalumai (kurių nespėjau patirti) 10. Turėtų būti scaling friendly 11. Galimybė atsukti sistemos būseną į bet kurią akimirką 12. Galimybė vėliau iš eventų traukti naujas analitines įžvalgas 13. Galimybė labiau paskirstyti backend developerių darbą (ar tikrai privalumas?) 40
  41. Klausimai? 41
Advertisement