SlideShare una empresa de Scribd logo
1 de 23
CQRS
Command Query Responsibility Segregation
Jornada de Arquitectura .NET - 2º Edició
sábado, 7 de septiembre de 2019
Fernando Sonego
Solution Architect in Algeiba
Muchachos tuve una
idea extraordinaria
que revolucionara al
mundo ¡¡¡Dividamos los
modelos de consulta
de los demás!!!
¿Eso no es
CQRS?
Si, lo presento
Greg Young el
año pasado
¿Qué es CQRS?
• Es un patrón bastante simple de entender.
• La Idea es en lugar de tener un modelo unificado, necesitamos tener 2,
uno para lectura y otro para escritura.
• Las principales características dicen que cada método debe ser un
comando o un consulta que solo haga una acción, pero no ambas cosas.
• Los comandos son del tipo Void.
• El patrón ayuda a la legibilidad del código, con un golpe de vista
podemos ver su propósito por su firma.
• CQRS extiende el principio de CQS a nivel arquitectura.
• CQRS fue presentado Greg Young en el año 2010, el se baso en la idea
Single Responsibility Principle correspondiente a SOLID.
Sorry for
thinking it
first
Command Query Responsibility
Segregation
Clientes
Modelo de
dominio
Consultas de
Lectura
API
Escritura
API
Lectura
DB
Relacional
DB No
Relacional
Sync
Comando Comandos
consulta Consultas
¿Y porque usar CQRS?
Escalabilidad Rendimiento Simplicidad
Escalabilidad
Crear Leer Actualizar Eliminar
Crear
Leer
Actualizar Eliminar
Escalabilidad | Rendimiento | Simplicidad
Crear
Actualizar
Eliminar
Leer
Comandos
1 Servidor
Consultas
10 Servidores
Consultas SQL
altamente optimizadas
Cache
Solo cambian datos
Reducción de código
complejo
En resumen
• CQRS nace a partir de CQS.
• CQRS extiende CQS a nivel arquitectocnico.
• Separa un modelo unificado en 2 partes: una de lectura y otra de escritura.
• CQRS nos permite tomar diferentes decisiones para las lecturas y
las escrituras.
• Mejor escalabilidad.
• Mejor Performance.
• Código Simple.
• CQRS es SRP (Single Responsability Principle) aplicado a nivel de
arquitectura.
Go to the Action
Code
Hablemos un poco mensajes
• En CQRS en realidad vamos a tener 3 tipos de mensajes
• Comandos, le dice a la aplicación que tiene que hacer algo.
• Consultas, le pregunta a la aplicación por algo.
• Eventos, información para externos.
Clientes
Aplicación
Comando
consulta
Eventos
Externos
Clean Code
• Convenciones de nombres
Comandos EventosConsultas
En imperativo
EditContactInfo
Empezar con Get
GetList
Pasado
ContactInfoChanged
NO! EditContactInfoComand GetListQuery ContactInfoChangedEvent
Problemas en la arquitectura de dominio
Clientes
Modelo de
dominio
Servicios
App
Servicios
App
API
API
• Modelo de dominio complicado
• Transporte pesado de datos
innecesarios
• Mala rendimiento para las
consultas
¿Entonces voy a tener 2 modelos de
dominio en DDD?
Clientes
Comandos
Consultas
DDD aquí
DDD no aquí
• Donde no hay modificación de datos
• No necesitamos encapsulación.
• No necesitamos abstracciones.
¿Qué otra cosa no debo hacer?
Clientes
Comandos
Consultas
No usar ORMs
No usar ORMs en lecturas
• ¡Pero tengo el lazy load activado!
• Cuando esta activosy necesitamos acceder a la base de datos se vuelve a
consultar ( bye bye perfomance).
• ¡Bueno lo desactivo!
• Tampoco no hace falta esta medida extrema.
• Conclusión
• Solo usar un grande y pesado ORM con comandos.
• Escribir a mano las consultas SQL.
Aumentemos el rendimiento y la
escalabilidad
Clientes
Comandos
Consultas
Master
Replica 1
Replica 1
Replica
Mismo problema, separamos las lecturas, pero
seguimos con los mismos modelos.
Pensemos un minuto
¿Que forma tienen la mayoría del tiempo los
datos de consulta?
DESNORMALIZADOS
¡Desnormalizada! ¿Y que hago entonces?
• Podemos crear tablas especializadas de consultas que se actualicen
por un trigger en la base de datos.
• Podemos, en el caso de SQL, usar vistas especializadas para las
consultas.
• Podemos crear una base de datos especializada total mente para
consultas para consultas.
• Podemos usar indexadores o bases de datos NoSQL.
Resumen sobre las bases de datos
• Bases de datos separadas para consultas
• Podemos implementar completo el patrón
CQRS.
• Las lecturas y escrituras están separadas
en cada nivel: API, servicios de
aplicaciones, modelo de dominio, base de
datos.
• Ajustar las lecturas de base de datos al a
necesidad real del modelo de consulta.
• Escalabilidad se da agregando recursos
de servidor
• Ejemplos de separación en el nivel de
base de datos:
• Vistas indexadas
• Replica de base de datos
• Algunas herramientas como Elastic Search.
• Diseñar la base de datos para lecturas
• Desnormalizar y ajustado a las
necesidades del modelo real.
• Reducir el numero de Joins y muchísimo
pos-procesamiento.
• La tercera forma normal es para
comandos, la primera mejor para
consultar.
• Podría necesitar una base de datos de
lectura separada para cada cliente.
• Mantener la sincronización es costoso;
eventual inconsistencia es confusa:
• en muchos casos, una sola base de datos
es suficiente
Tarea para hogar
• Commandos Vs DTOs.
• Sincronización de comandos y consultas:
• Proyecciones impulsadas por estados.
• Proyecciones manejadas por manejadores de eventos.
• Consistencia.
• Consistencia Eventual.
• Versionado.
• Expedición de cache
• CQRS vs Patrón Especificación
• Handlers Vs Decoradores Vs Middleware
Conclusiones y Preguntas
Fernando Sonego
Solution Architect
fernando.sonego@gmail.com
@FernandoSonego
www.withoutdebugger.com
Jornada de Arquitectura .NET
2º Edición
sábado, 7 de septiembre de 2019

Más contenido relacionado

Similar a Jornada de Arquitectura .NET - 2º Edición

presentacinorm-150325230016-conversion-gate01.pptx
presentacinorm-150325230016-conversion-gate01.pptxpresentacinorm-150325230016-conversion-gate01.pptx
presentacinorm-150325230016-conversion-gate01.pptxssuser948499
 
Fundamentos para el diseño de una RESTful API pragmática
Fundamentos para el diseño de una RESTful API pragmáticaFundamentos para el diseño de una RESTful API pragmática
Fundamentos para el diseño de una RESTful API pragmáticaLeoWong91
 
.NET UY Meetup 4 - AOP & PostSharp by Bruno Bologna & Fabian Fernandez
.NET UY Meetup 4 - AOP & PostSharp by Bruno Bologna & Fabian Fernandez.NET UY Meetup 4 - AOP & PostSharp by Bruno Bologna & Fabian Fernandez
.NET UY Meetup 4 - AOP & PostSharp by Bruno Bologna & Fabian Fernandez.NET UY Meetup
 
Arquitectura aplicaciones clase3
Arquitectura aplicaciones clase3Arquitectura aplicaciones clase3
Arquitectura aplicaciones clase3Germania Rodriguez
 
Java script para desarrolladores SharePoint
Java script para desarrolladores SharePointJava script para desarrolladores SharePoint
Java script para desarrolladores SharePointAdrian Diaz Cervera
 
Re evolución robótica
Re evolución robóticaRe evolución robótica
Re evolución robóticaSoftware Guru
 
Actividad de aprendizaje 4
Actividad de aprendizaje 4Actividad de aprendizaje 4
Actividad de aprendizaje 4Sinai Diaz
 
Desarrollo modermo de aplicaciones web
Desarrollo modermo de aplicaciones webDesarrollo modermo de aplicaciones web
Desarrollo modermo de aplicaciones webRoberto Sanz Ciriano
 
Introducción mongodb y desarrollo
Introducción mongodb y desarrolloIntroducción mongodb y desarrollo
Introducción mongodb y desarrolloJuan Ladetto
 
Ionic y angular.js
Ionic y angular.jsIonic y angular.js
Ionic y angular.jsGDG Cali
 
LenguajeJavaSpringBootDesarrolloweb.pptx
LenguajeJavaSpringBootDesarrolloweb.pptxLenguajeJavaSpringBootDesarrolloweb.pptx
LenguajeJavaSpringBootDesarrolloweb.pptxcarrilloja98
 
Analisis de requerimientos, Ingenieria de Software
Analisis de requerimientos, Ingenieria de SoftwareAnalisis de requerimientos, Ingenieria de Software
Analisis de requerimientos, Ingenieria de SoftwareMarvin Romero
 
Prototipos
PrototiposPrototipos
PrototiposTensor
 

Similar a Jornada de Arquitectura .NET - 2º Edición (20)

presentacinorm-150325230016-conversion-gate01.pptx
presentacinorm-150325230016-conversion-gate01.pptxpresentacinorm-150325230016-conversion-gate01.pptx
presentacinorm-150325230016-conversion-gate01.pptx
 
Presentacion cw2012
Presentacion cw2012Presentacion cw2012
Presentacion cw2012
 
Fundamentos para el diseño de una RESTful API pragmática
Fundamentos para el diseño de una RESTful API pragmáticaFundamentos para el diseño de una RESTful API pragmática
Fundamentos para el diseño de una RESTful API pragmática
 
.NET UY Meetup 4 - AOP & PostSharp by Bruno Bologna & Fabian Fernandez
.NET UY Meetup 4 - AOP & PostSharp by Bruno Bologna & Fabian Fernandez.NET UY Meetup 4 - AOP & PostSharp by Bruno Bologna & Fabian Fernandez
.NET UY Meetup 4 - AOP & PostSharp by Bruno Bologna & Fabian Fernandez
 
Arquitectura aplicaciones clase3
Arquitectura aplicaciones clase3Arquitectura aplicaciones clase3
Arquitectura aplicaciones clase3
 
Panel Magmaconf
Panel MagmaconfPanel Magmaconf
Panel Magmaconf
 
Azure infrastructure testing con inspec
Azure infrastructure testing con inspecAzure infrastructure testing con inspec
Azure infrastructure testing con inspec
 
Java script para desarrolladores SharePoint
Java script para desarrolladores SharePointJava script para desarrolladores SharePoint
Java script para desarrolladores SharePoint
 
20150415 roslyn
20150415 roslyn20150415 roslyn
20150415 roslyn
 
Re evolución robótica
Re evolución robóticaRe evolución robótica
Re evolución robótica
 
Servicios de Bases de Datos de AWS
Servicios de Bases de Datos de AWSServicios de Bases de Datos de AWS
Servicios de Bases de Datos de AWS
 
Actividad de aprendizaje 4
Actividad de aprendizaje 4Actividad de aprendizaje 4
Actividad de aprendizaje 4
 
Desarrollo modermo de aplicaciones web
Desarrollo modermo de aplicaciones webDesarrollo modermo de aplicaciones web
Desarrollo modermo de aplicaciones web
 
Introducción mongodb y desarrollo
Introducción mongodb y desarrolloIntroducción mongodb y desarrollo
Introducción mongodb y desarrollo
 
Ionic y angular.js
Ionic y angular.jsIonic y angular.js
Ionic y angular.js
 
LenguajeJavaSpringBootDesarrolloweb.pptx
LenguajeJavaSpringBootDesarrolloweb.pptxLenguajeJavaSpringBootDesarrolloweb.pptx
LenguajeJavaSpringBootDesarrolloweb.pptx
 
Analisis de requerimientos, Ingenieria de Software
Analisis de requerimientos, Ingenieria de SoftwareAnalisis de requerimientos, Ingenieria de Software
Analisis de requerimientos, Ingenieria de Software
 
Prototipos
PrototiposPrototipos
Prototipos
 
ASP.NET MVC
ASP.NET MVCASP.NET MVC
ASP.NET MVC
 
Day01
Day01Day01
Day01
 

Más de fernando sonego

Algeiba meetup Net Baires Bot Empresariales
Algeiba meetup Net Baires Bot EmpresarialesAlgeiba meetup Net Baires Bot Empresariales
Algeiba meetup Net Baires Bot Empresarialesfernando sonego
 
Novedades .Net Core - NetBaires
Novedades .Net Core - NetBairesNovedades .Net Core - NetBaires
Novedades .Net Core - NetBairesfernando sonego
 
Jornada de Arquitectura .NET - 3º Edición
Jornada de Arquitectura .NET - 3º EdiciónJornada de Arquitectura .NET - 3º Edición
Jornada de Arquitectura .NET - 3º Ediciónfernando sonego
 
vOpenUy: Construye tu aplicación Multi-Tenant
vOpenUy: Construye tu aplicación Multi-TenantvOpenUy: Construye tu aplicación Multi-Tenant
vOpenUy: Construye tu aplicación Multi-Tenantfernando sonego
 
2019.10.04.v open.azurevsaws
2019.10.04.v open.azurevsaws2019.10.04.v open.azurevsaws
2019.10.04.v open.azurevsawsfernando sonego
 
Xamarin y azure b2c Servicio de identidad para tus apps
Xamarin y azure b2c Servicio de identidad para tus appsXamarin y azure b2c Servicio de identidad para tus apps
Xamarin y azure b2c Servicio de identidad para tus appsfernando sonego
 
Azure bootcampo 2019 start up_v1
Azure bootcampo 2019 start up_v1Azure bootcampo 2019 start up_v1
Azure bootcampo 2019 start up_v1fernando sonego
 
Net-Baires: CleanCode 20190622
Net-Baires: CleanCode 20190622Net-Baires: CleanCode 20190622
Net-Baires: CleanCode 20190622fernando sonego
 
NetBaires 2018 - Azure Serach
NetBaires 2018 - Azure SerachNetBaires 2018 - Azure Serach
NetBaires 2018 - Azure Serachfernando sonego
 
NetConfUy 2018 - Azure B2C
NetConfUy 2018 - Azure B2CNetConfUy 2018 - Azure B2C
NetConfUy 2018 - Azure B2Cfernando sonego
 
NetConfCo 2018 Azure B2C
NetConfCo 2018  Azure B2CNetConfCo 2018  Azure B2C
NetConfCo 2018 Azure B2Cfernando sonego
 
.Net core multiplataforma. sera verdad???
.Net core multiplataforma. sera verdad???.Net core multiplataforma. sera verdad???
.Net core multiplataforma. sera verdad???fernando sonego
 
Net conf ar v2018 start up
Net conf ar v2018 start upNet conf ar v2018 start up
Net conf ar v2018 start upfernando sonego
 
DevDayAr de Junior a Sernior ¿Cual es el camino?
DevDayAr de Junior a Sernior ¿Cual es el camino?DevDayAr de Junior a Sernior ¿Cual es el camino?
DevDayAr de Junior a Sernior ¿Cual es el camino?fernando sonego
 
Net conf uy 2017 type script
Net conf uy 2017   type scriptNet conf uy 2017   type script
Net conf uy 2017 type scriptfernando sonego
 
Azure Microsft Cognite Service
Azure Microsft Cognite ServiceAzure Microsft Cognite Service
Azure Microsft Cognite Servicefernando sonego
 

Más de fernando sonego (18)

Algeiba meetup Net Baires Bot Empresariales
Algeiba meetup Net Baires Bot EmpresarialesAlgeiba meetup Net Baires Bot Empresariales
Algeiba meetup Net Baires Bot Empresariales
 
AI+ Tour 2019 Argentina
AI+ Tour 2019 ArgentinaAI+ Tour 2019 Argentina
AI+ Tour 2019 Argentina
 
Novedades .Net Core - NetBaires
Novedades .Net Core - NetBairesNovedades .Net Core - NetBaires
Novedades .Net Core - NetBaires
 
Jornada de Arquitectura .NET - 3º Edición
Jornada de Arquitectura .NET - 3º EdiciónJornada de Arquitectura .NET - 3º Edición
Jornada de Arquitectura .NET - 3º Edición
 
vOpenUy: Construye tu aplicación Multi-Tenant
vOpenUy: Construye tu aplicación Multi-TenantvOpenUy: Construye tu aplicación Multi-Tenant
vOpenUy: Construye tu aplicación Multi-Tenant
 
2019.10.04.v open.azurevsaws
2019.10.04.v open.azurevsaws2019.10.04.v open.azurevsaws
2019.10.04.v open.azurevsaws
 
Xamarin y azure b2c Servicio de identidad para tus apps
Xamarin y azure b2c Servicio de identidad para tus appsXamarin y azure b2c Servicio de identidad para tus apps
Xamarin y azure b2c Servicio de identidad para tus apps
 
Azure bootcampo 2019 start up_v1
Azure bootcampo 2019 start up_v1Azure bootcampo 2019 start up_v1
Azure bootcampo 2019 start up_v1
 
Net-Baires: CleanCode 20190622
Net-Baires: CleanCode 20190622Net-Baires: CleanCode 20190622
Net-Baires: CleanCode 20190622
 
NetBaires 2018 - Azure Serach
NetBaires 2018 - Azure SerachNetBaires 2018 - Azure Serach
NetBaires 2018 - Azure Serach
 
NetConfUy 2018 - Azure B2C
NetConfUy 2018 - Azure B2CNetConfUy 2018 - Azure B2C
NetConfUy 2018 - Azure B2C
 
NetConfCo 2018 Azure B2C
NetConfCo 2018  Azure B2CNetConfCo 2018  Azure B2C
NetConfCo 2018 Azure B2C
 
.Net core multiplataforma. sera verdad???
.Net core multiplataforma. sera verdad???.Net core multiplataforma. sera verdad???
.Net core multiplataforma. sera verdad???
 
Net conf ar v2018 start up
Net conf ar v2018 start upNet conf ar v2018 start up
Net conf ar v2018 start up
 
DevDayAr de Junior a Sernior ¿Cual es el camino?
DevDayAr de Junior a Sernior ¿Cual es el camino?DevDayAr de Junior a Sernior ¿Cual es el camino?
DevDayAr de Junior a Sernior ¿Cual es el camino?
 
Net conf uy 2017 type script
Net conf uy 2017   type scriptNet conf uy 2017   type script
Net conf uy 2017 type script
 
DevOps - TechNights
DevOps - TechNightsDevOps - TechNights
DevOps - TechNights
 
Azure Microsft Cognite Service
Azure Microsft Cognite ServiceAzure Microsft Cognite Service
Azure Microsft Cognite Service
 

Último

Segmentacion Segmantica_Modelos UNET and DEEPLABV3
Segmentacion Segmantica_Modelos UNET and DEEPLABV3Segmentacion Segmantica_Modelos UNET and DEEPLABV3
Segmentacion Segmantica_Modelos UNET and DEEPLABV3AlexysCaytanoMelndez1
 
Introducción a Funciones LENGUAJE DART FLUTTER
Introducción a Funciones LENGUAJE DART FLUTTERIntroducción a Funciones LENGUAJE DART FLUTTER
Introducción a Funciones LENGUAJE DART FLUTTEREMMAFLORESCARMONA
 
Manual de Usuario APPs_AppInventor-2023.pdf
Manual de Usuario APPs_AppInventor-2023.pdfManual de Usuario APPs_AppInventor-2023.pdf
Manual de Usuario APPs_AppInventor-2023.pdfmasogeis
 
Caso de éxito de Hervian con el ERP Sage 200
Caso de éxito de Hervian con el ERP Sage 200Caso de éxito de Hervian con el ERP Sage 200
Caso de éxito de Hervian con el ERP Sage 200Opentix
 
PARTES DEL TECLADO Y SUS FUNCIONES - EJEMPLO
PARTES DEL TECLADO Y SUS FUNCIONES - EJEMPLOPARTES DEL TECLADO Y SUS FUNCIONES - EJEMPLO
PARTES DEL TECLADO Y SUS FUNCIONES - EJEMPLOSelenaCoronadoHuaman
 
Unidad_3_T1_AutomatasFinitos presentacion
Unidad_3_T1_AutomatasFinitos presentacionUnidad_3_T1_AutomatasFinitos presentacion
Unidad_3_T1_AutomatasFinitos presentacionarmando_cardenas
 
BREEAM ES Urbanismo como herramienta para un planeamiento sostenible - Miguel...
BREEAM ES Urbanismo como herramienta para un planeamiento sostenible - Miguel...BREEAM ES Urbanismo como herramienta para un planeamiento sostenible - Miguel...
BREEAM ES Urbanismo como herramienta para un planeamiento sostenible - Miguel...ITeC Instituto Tecnología Construcción
 

Último (7)

Segmentacion Segmantica_Modelos UNET and DEEPLABV3
Segmentacion Segmantica_Modelos UNET and DEEPLABV3Segmentacion Segmantica_Modelos UNET and DEEPLABV3
Segmentacion Segmantica_Modelos UNET and DEEPLABV3
 
Introducción a Funciones LENGUAJE DART FLUTTER
Introducción a Funciones LENGUAJE DART FLUTTERIntroducción a Funciones LENGUAJE DART FLUTTER
Introducción a Funciones LENGUAJE DART FLUTTER
 
Manual de Usuario APPs_AppInventor-2023.pdf
Manual de Usuario APPs_AppInventor-2023.pdfManual de Usuario APPs_AppInventor-2023.pdf
Manual de Usuario APPs_AppInventor-2023.pdf
 
Caso de éxito de Hervian con el ERP Sage 200
Caso de éxito de Hervian con el ERP Sage 200Caso de éxito de Hervian con el ERP Sage 200
Caso de éxito de Hervian con el ERP Sage 200
 
PARTES DEL TECLADO Y SUS FUNCIONES - EJEMPLO
PARTES DEL TECLADO Y SUS FUNCIONES - EJEMPLOPARTES DEL TECLADO Y SUS FUNCIONES - EJEMPLO
PARTES DEL TECLADO Y SUS FUNCIONES - EJEMPLO
 
Unidad_3_T1_AutomatasFinitos presentacion
Unidad_3_T1_AutomatasFinitos presentacionUnidad_3_T1_AutomatasFinitos presentacion
Unidad_3_T1_AutomatasFinitos presentacion
 
BREEAM ES Urbanismo como herramienta para un planeamiento sostenible - Miguel...
BREEAM ES Urbanismo como herramienta para un planeamiento sostenible - Miguel...BREEAM ES Urbanismo como herramienta para un planeamiento sostenible - Miguel...
BREEAM ES Urbanismo como herramienta para un planeamiento sostenible - Miguel...
 

Jornada de Arquitectura .NET - 2º Edición

  • 1. CQRS Command Query Responsibility Segregation Jornada de Arquitectura .NET - 2º Edició sábado, 7 de septiembre de 2019 Fernando Sonego Solution Architect in Algeiba
  • 2.
  • 3. Muchachos tuve una idea extraordinaria que revolucionara al mundo ¡¡¡Dividamos los modelos de consulta de los demás!!! ¿Eso no es CQRS? Si, lo presento Greg Young el año pasado
  • 4. ¿Qué es CQRS? • Es un patrón bastante simple de entender. • La Idea es en lugar de tener un modelo unificado, necesitamos tener 2, uno para lectura y otro para escritura. • Las principales características dicen que cada método debe ser un comando o un consulta que solo haga una acción, pero no ambas cosas. • Los comandos son del tipo Void. • El patrón ayuda a la legibilidad del código, con un golpe de vista podemos ver su propósito por su firma. • CQRS extiende el principio de CQS a nivel arquitectura. • CQRS fue presentado Greg Young en el año 2010, el se baso en la idea Single Responsibility Principle correspondiente a SOLID. Sorry for thinking it first
  • 5. Command Query Responsibility Segregation Clientes Modelo de dominio Consultas de Lectura API Escritura API Lectura DB Relacional DB No Relacional Sync Comando Comandos consulta Consultas
  • 6. ¿Y porque usar CQRS? Escalabilidad Rendimiento Simplicidad
  • 7. Escalabilidad Crear Leer Actualizar Eliminar Crear Leer Actualizar Eliminar
  • 8. Escalabilidad | Rendimiento | Simplicidad Crear Actualizar Eliminar Leer Comandos 1 Servidor Consultas 10 Servidores Consultas SQL altamente optimizadas Cache Solo cambian datos Reducción de código complejo
  • 9. En resumen • CQRS nace a partir de CQS. • CQRS extiende CQS a nivel arquitectocnico. • Separa un modelo unificado en 2 partes: una de lectura y otra de escritura. • CQRS nos permite tomar diferentes decisiones para las lecturas y las escrituras. • Mejor escalabilidad. • Mejor Performance. • Código Simple. • CQRS es SRP (Single Responsability Principle) aplicado a nivel de arquitectura.
  • 10. Go to the Action Code
  • 11. Hablemos un poco mensajes • En CQRS en realidad vamos a tener 3 tipos de mensajes • Comandos, le dice a la aplicación que tiene que hacer algo. • Consultas, le pregunta a la aplicación por algo. • Eventos, información para externos. Clientes Aplicación Comando consulta Eventos Externos
  • 12. Clean Code • Convenciones de nombres Comandos EventosConsultas En imperativo EditContactInfo Empezar con Get GetList Pasado ContactInfoChanged NO! EditContactInfoComand GetListQuery ContactInfoChangedEvent
  • 13. Problemas en la arquitectura de dominio Clientes Modelo de dominio Servicios App Servicios App API API • Modelo de dominio complicado • Transporte pesado de datos innecesarios • Mala rendimiento para las consultas
  • 14. ¿Entonces voy a tener 2 modelos de dominio en DDD? Clientes Comandos Consultas DDD aquí DDD no aquí • Donde no hay modificación de datos • No necesitamos encapsulación. • No necesitamos abstracciones.
  • 15. ¿Qué otra cosa no debo hacer? Clientes Comandos Consultas No usar ORMs
  • 16. No usar ORMs en lecturas • ¡Pero tengo el lazy load activado! • Cuando esta activosy necesitamos acceder a la base de datos se vuelve a consultar ( bye bye perfomance). • ¡Bueno lo desactivo! • Tampoco no hace falta esta medida extrema. • Conclusión • Solo usar un grande y pesado ORM con comandos. • Escribir a mano las consultas SQL.
  • 17. Aumentemos el rendimiento y la escalabilidad Clientes Comandos Consultas Master Replica 1 Replica 1 Replica Mismo problema, separamos las lecturas, pero seguimos con los mismos modelos.
  • 18. Pensemos un minuto ¿Que forma tienen la mayoría del tiempo los datos de consulta? DESNORMALIZADOS
  • 19. ¡Desnormalizada! ¿Y que hago entonces? • Podemos crear tablas especializadas de consultas que se actualicen por un trigger en la base de datos. • Podemos, en el caso de SQL, usar vistas especializadas para las consultas. • Podemos crear una base de datos especializada total mente para consultas para consultas. • Podemos usar indexadores o bases de datos NoSQL.
  • 20. Resumen sobre las bases de datos • Bases de datos separadas para consultas • Podemos implementar completo el patrón CQRS. • Las lecturas y escrituras están separadas en cada nivel: API, servicios de aplicaciones, modelo de dominio, base de datos. • Ajustar las lecturas de base de datos al a necesidad real del modelo de consulta. • Escalabilidad se da agregando recursos de servidor • Ejemplos de separación en el nivel de base de datos: • Vistas indexadas • Replica de base de datos • Algunas herramientas como Elastic Search. • Diseñar la base de datos para lecturas • Desnormalizar y ajustado a las necesidades del modelo real. • Reducir el numero de Joins y muchísimo pos-procesamiento. • La tercera forma normal es para comandos, la primera mejor para consultar. • Podría necesitar una base de datos de lectura separada para cada cliente. • Mantener la sincronización es costoso; eventual inconsistencia es confusa: • en muchos casos, una sola base de datos es suficiente
  • 21. Tarea para hogar • Commandos Vs DTOs. • Sincronización de comandos y consultas: • Proyecciones impulsadas por estados. • Proyecciones manejadas por manejadores de eventos. • Consistencia. • Consistencia Eventual. • Versionado. • Expedición de cache • CQRS vs Patrón Especificación • Handlers Vs Decoradores Vs Middleware