230 likes | 379 Views
CQRS. Command-Query Responsibility Segregation - scurt ă introducere , exemple - Tudor Turcu iQuest. CQRS – what?. Command-Query Respons a bility Segregation: principiu ‘ vechi ’, buzzword nou
E N D
CQRS Command-Query Responsibility Segregation -scurtăintroducere, exemple- Tudor Turcu iQuest
CQRS – what? • Command-Query Responsability Segregation: principiu ‘vechi’, buzzword nou • Folosireaunui domain model pentruupdatareadatelor, separatde celfolositpentrucitirealor • Bertrand Meyer:CQS: Command and Query Separation Principle – o metodăartrebui să fie ori o comandăceexecută o acțiune, fie un query cereturnează date (interogări fără side-effects)
Arhitectură „tipică” (C) Greg Young
CQRS – why? • Ceproblemeduc la necesitateaaplicăriiacestui “pattern”? • Dificultatea aplicarii DDD in arhitecturile „clasice”: DTO, operatii CRUD • Data storage – limitează scalabilitatea • „Intentia” userului se pierde
CQRS – How? • Poate fi aplicat gradual, la diferite nivele în aplicație, în funcție de necesităti • Primul pas: separarea „query model” de domain model • Task-based UI command objects • Separarea se poate continua la toate layerele (inclusiv data storage) • Solutii de implentare (optionale): command handlers, event sourcing, separate read DB, command queues etc.(nu fac parte din CQRS)
„Behavioral Interface” (C) Greg Young
Commands • Reprezintă „intenția” userului (derivate din use cases) • Simplu obiect ce conține numele operației și datele necesare efectuarii operației • O comandă poate eșua (poate fi respinsă de application server) • Procesate de către command handlers: • Similare cu application services • Nu conțin business logic propriu • Fatadă la domain model
„Command side” (C) Greg Young
CQRS „Command side” „Query side” • Data consistente (valide și actuale) • Data storage: tranzactional, normalizat • mai putine tranzactii, nu trebuie sa fie foarte scalabil • Permite (uneori) date care nu sunt actuale • Date denormalizate • Multe interogari, scalabilitate ridicata
„Query” side • Poate sa nu folosească domain objects, ci DTOs • Nu necesită un O/RM • Poate folosi views sau stored procedures care să producă modelul denormalizat • Ușor de implementat (echipă separată, developeri mai puțin experimentați) • Scalabilitate
„Query side” (C) Greg Young
„Command side” • Behaviour / DDD • Posibilă solutie: • Commands Domain model DB relational/normalizat • Sau Command Domain model Events Events storage • Data storage – separat de „query side”, sau nu • Avantaje: • Domain model-ul nu mai trebuie sa expuna stete-ul intern • Separation of concerns (domain model-ul nu mai e folosit pentru query-uri)
„Command side” (C) Greg Young
Data storage separate (C) Greg Young
Data storage separate Dezavantaje Avantaje • Dificultatea de a le menține sincronizate • Dificulatatea de a corecta o eroare la sincronizare • Eventual consistency • Scalabilitate / performanță
Posibile soluții (command side) • Events / event sourcing • O comandă procesată cu success event (s) • Reprezintă ceva ce s-a întămplat in trecut • similarecastructurăcu comenzile, dardiferite: • poatefi anulatdoarprintr-o altaactiune care sa-ianulezeefectele (compensate) • comenzileau behaviourînglobat (evenimentele nu) • Pot fi stocate și starea sistemului reconstituită oricând pornind de la evenimente elimină necesitatea unui storage relațional/normalizat • „deltas”
Event sourcing Avantaje Dezavantaje • Audit log built-in • „Behavioral model” • Scenarii „what-if” • Append-only • Versionare ușurată • Debugging mai facil • Scalabil • Partitionare orizontală • Elimină discrepanțele dintre relațional și obiectual • Probleme de performanță (rezolvate cu rolling snapshots) • Se pretează acolo unde DDD poate fi aplicat costuri/complexitate inerentă în aplicare • Limitat la query-uri gen: GetAggregateById(..) • Discrepanță intre events și read model
Event sourcing – implementare • Câte un event storage per aggregate • Există event storage-uri gata implementate • 3 tabele: • Events • Aggregates • Snapshots – create asincron de către un proces în background
CQRS + Event sourcing (C) Greg Young
CQRS Sample https://github.com/MarkNijhof/Fohjin (Mark Nijhof – ‘Fohjin’)
CQRS – more info • Greg Young – cqrsinfo.com • Martin Fowler - http://martinfowler.com/bliki/CQRS.html • Udi Dahan – Clarified CQRShttp://www.udidahan.com/2009/12/09/clarified-cqrs/ • ElegantCode – CQRS a la Greg Young: http://elegantcode.com/2009/11/11/cqrs-la-greg-young/ • DDD/CQRS Google Group: http://groups.google.com/group/dddcqrs • Other CQRS resources: http://www.thedeveloperday.com/cqrs-resources/ • Martin Fowler – Event sourcing: http://martinfowler.com/eaaDev/EventSourcing.html • Articole ce descriu sample-ul: http://elegantcode.com/2009/11/11/cqrs-la-greg-young/