Manuel Pérez

CQRS

Escritorio de madera con un portátil, una tableta, una taza de café, gafas, libros y alguien escribiendo en una libreta.

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