Big building.

馃洬 CQRS

February 12, 2022

Command Query Responsibility Segregation es un patr贸n de dise帽o de software que separa los modelos de escritura y lectura de datos con el objetivo principal de mejorar el rendimiento de un sistema con alta tasa de concurrencia garantizando la escalabilidad del mismo.

Por ejemplo, supongamos que tenemos una tienda online de libros y ejecutamos nuestra operativa normal centralizando la gesti贸n del portal desde una sola base de datos. Ejecutamos nuestra operativa normal y de repente empezamos a vender el libro de George R.R. Martin por lo que recibe muchas operaciones de lectura y escritura con comentarios y compras.

Lo que pasa aqu铆 es que este pico de usuarios atacando con muchas operaciones hacen que la base de datos sufra y ralentice el funcionamiento del portal.

En este caso la soluci贸n ser铆a CQRS. Al separar las operaciones de lectura y escritura garantizar铆amos la integridad de nuestro servicio en picos de concurrencia.

Command

Es un DTO que expresa la intenci贸n de modificar nuestro sistema, es decir, que generar谩 un side effect.

Query

Es un DTO que expresa la intenci贸n de recuperar informaci贸n de nuestro sistema sin modificar el mismo.

Handler

Es el encargado de gestionar el command o query correspondiente transformando sus primitivos a value objects y llamando al caso de uso. Solo existe un handler para cada command o query.

Bus

El bus es el encargado de llevar el DTO a su Handler y este handler transformar谩 los primitivos en value objects y ejecutar谩 el caso de uso.

El beneficio de esta complejidad adicional es desacoplar el comportamiento del dominio del controlador estando estos totalmente aislados comunidados por el bus.

Problemas

Como hemos visto el uso de este patr贸n aumenta sustancialmente la complejidad del sistema por lo que solo es recomendable usarlo en productos en los que se espere un alto volumen de concurrencia.

En la mayor铆a de casos deberemos separar las bases de datos por lo que puede ocasionar inconsistencia de los datos de lectura por lo que es necesario sincronizar dichas bases de datos.

Para finalizar

Entender todas las implicaciones de CQRS es complicado y necesita tiempo de estudio y pr谩ctica.

Aqu铆 dejo un enlace a una implementaci贸n muy simple de CQRS.

Implementaci贸n CQRS en TS