200 likes | 490 Views
CQRS. Marçal Serrate Software Architect | pasiona consulting twitter : @ mserrate b log: http://www.serrate.es e mail: m.serrate@gmail.com. Agenda. DDD y CQRS Problemáticas en aplicaciones n- layer Ejemplo CQRS al rescate Task based UI Commands Events … Event Sourcing
E N D
CQRS MarçalSerrate Software Architect | pasionaconsulting twitter: @mserrate blog: http://www.serrate.es email: m.serrate@gmail.com
Agenda • DDD y CQRS • Problemáticas en aplicaciones n-layer • Ejemplo • CQRS al rescate • Taskbased UI • Commands • Events • … • EventSourcing • Snapshots • Demo
DDD y CQRS • Domain-DrivenDesign • Conceptos • UbiquitousLanguage • Entity, ValueObject • Aggregate • Mucho más…. • CQRS no sustituye a DDDlo complementa
Problemática en aplicaciones típicas n-layer • Modelo anémico(getters/setters) • Muchas conversionesDTO Entidad • Único modelo para: • Lecturas • Escrituras • Búsquedas • Reporting
CQRS al rescate Para evitar lo anterior… Separar lecturas de escrituras
Commands • Capturar la intención del usuarioSaveCustomer CorrectCustomerName, ChangePassword… • Verbo imperativo • Síncronos / Asíncronos • Validar entrada de datoslongitud campo texto, campos requeridos, etc.
Taskbased UI • Orientar cada pantalla a una única tarea • Título de la pantalla explícito y conciso • El contenido debe ajustarse a la tarea • Ofrecer enlaces a tareas secundarias vs
CommandHandlers • Procesa los Commands ejecutando el correspondiente método de dominio • No puede haber lógica de dominio • Se ocupa de elementos Cross-CuttingAutorizaciones, Trazas, etc. • Ejemplo:
AggregateRoot • Aggregate: Agrupación lógica de Entities y ValueObjects • Accedemos a cualquier elemento a través del AggregateRoot • Ejemplo:
Events • Representan el cambio de estado del Aggregate al procesar un Command • Verbo pasado: Acción completada • Ejemplo:
EventHandlers • Procesa los Events para insertarlos en el almacenamiento de lectura • Actúa como Denormalizador(1:1) • Puede realizar operaciones Cross-Cutting • Ejemplo:
CQRS: Perspectiva 2-Phase Commit • Asegurarnos la publicación en ambos almacenes • Modelos desincronizados Soluciones: • MSDTC • EventSourcing
EventSourcing • Almacén escritura == Log de todos los eventos • No existe DELETE. Sólo añadimos eventos • Para obtener el estado actual basta con aplicar todos los eventos • Puede actuar como cola de eventos, evitando 2PC • Escalabilidad. Partición horizontal sencilla: Aggregate ID ¿Qué pasa si existen millones de eventos?
Snapshots • Cada n eventos almacenar el estado actual del Aggregate • Para cargarlo, obtenemos el snapshot y aplicamos los eventos que han ocurrido desde que se almacenó
Eventual Consistency «Retraso entre almacén escritura y lectura» • Usuarios ven datos antiguos ≠ inconsistentes • Normalmente es así por rendimiento y alta disponibilidad (p.e. Cache) Soluciones: • Adaptar UI • «Se está procesando su petición…» • Presentar posibles tareas a realizar • Educar al cliente • Falsear los cambios en cliente… Feo, feo…
Demo Ncqrs: Framework de CQRS para .NET • http://ncqrs.org • EventSourcing, snapshots • RavenDB, MongoDB, MSSQL • NServiceBuspero… • Demasiado complejo • Nuevas versiones no compatibles con antiguas
Enlaces • UdiDahan. http://www.udidahan.com/ • Greg Young. http://codebetter.com/gregyoung/ • Jonathan Oliver. http://blog.jonathanoliver.com/ • Mark Nijhof. http://cre8ivethought.com/blog/index • Task-BasedUI. http://msdn.microsoft.com/en-us/library/ms997506.aspx
¿Preguntas? MarçalSerrate Software Architect| pasionaconsulting twitter: @mserrate blog: http://www.serrate.es email: m.serrate@gmail.com