CQRS: Mejora fácilmente la arquitectura de tu aplicación

| Última modificación: 2 de octubre de 2024 | Tiempo de Lectura: 4 minutos

Algunos de nuestros reconocimientos:

Premios KeepCoding

Para que puedas crear aplicaciones escalables y eficientes, es necesario que uses la arquitectura adecuada. Si no sabes cómo elegirla, en este post te contaremos todo sobre CQRS y cómo este patrón puede marcar la diferencia en tus proyectos y, de paso, mejorar la arquitectura de tu aplicación.

qué es CQRS

¿Qué es CQRS?

CQRS, que significa Command Query Responsibility Segregation o en español, Separación de Responsabilidades de Comandos y Consultas, es una forma de organizar el código que hace que las operaciones de lectura (consultas) y las de escritura (comandos) se manejen por separado. Entonces, en lugar de tener un único sistema que se encarga de todo, con CQRS divides el trabajo en dos partes, de tal manera que cada una se optimiza y se ajusta de acuerdo a lo que necesita hacer.

Para que lo entiendas mejor, piensa que con CQRS un comando es simplemente una instrucción que modifica datos (como agregar o actualizar algo), pero no te devuelve ninguna información. Por otro lado, una consulta es solo para obtener datos y no hace ningún cambio en el sistema. Al dividir estas responsabilidades, el código se vuelve más simple de entender y mucho más fácil de mantener, especialmente en aplicaciones grandes o distribuidas donde las operaciones pueden complicarse.

¿Cómo funciona CQRS?

El funcionamiento de CQRS es bastante sencillo. Piensa que estás desarrollando una aplicación de inventario. Sin CQRS, solo tendrías un único repositorio encargado de manejar tanto la lectura como la escritura de datos.

Ahora bien, si decides usar CQRS, lograrías separar estas responsabilidades en dos repositorios diferentes: uno lo usarías para realizar las consultas de los productos disponibles y el otro para registrar las nuevas entradas o modificar el inventario.

De esta manera no solo optimizas el rendimiento, sino que también mejoras la claridad de tu código. Por ejemplo, podrías tener una clase ProductoQueryRepository para consultar productos y un ProductoCommandRepository para actualizar o agregar productos al inventario.

Esta sería la implementación básica:

public class ProductoQueryRepository {
private List<Producto> productos;

public ProductoQueryRepository(List<Producto> productos) {
this.productos = productos;
}

public List<Producto> obtenerProductosDisponibles() {
return productos.stream()
.filter(producto -> producto.getStock() > 0)
.collect(Collectors.toList());
}
}

public class ProductoCommandRepository {
private List<Producto> productos;

public ProductoCommandRepository(List<Producto> productos) {
this.productos = productos;
}

public void agregarProducto(Producto producto) {
productos.add(producto);
}

public void actualizarStock(String nombreProducto, int nuevoStock) {
productos.stream()
.filter(producto -> producto.getNombre().equals(nombreProducto))
.findFirst()
.ifPresent(producto -> producto.setStock(nuevoStock));
}
}

¿Cómo CQRS mejora la arquitectura de tu aplicación?

Te sorprenderá saber que, este patrón mejora la arquitectura de tu aplicación en varios aspectos:

  1. Escalabilidad: Al separar las operaciones de lectura y escritura, puedes escalar de manera independiente. Por ejemplo, si tu aplicación requiere muchas más consultas que actualizaciones, puedes optimizar la infraestructura de consulta sin afectar las operaciones de escritura.
  2. Mantenimiento: La separación de responsabilidades facilita el mantenimiento. Al tener repositorios y servicios separados para lectura y escritura, el código es más fácil de entender y modificar.
  3. Optimización de consultas: El modelo de consulta (queries) puede enfocarse exclusivamente en retornar datos necesarios. Puedes usar objetos simplificados como DTOs (Data Transfer Objects) para obtener solo los campos que necesitas, lo que optimiza las respuestas.
  4. Seguridad: Las operaciones de escritura pueden estar más controladas y protegidas. Si separas la lógica de comandos en una capa distinta, puedes implementar validaciones y reglas de negocio más estrictas.

¿Cuándo es recomendable utilizar CQRS?

Debes saber que, aunque es útil en varias aplicaciones, no es necesario que lo uses en todas. Te resultará muy útil en estos sistemas:

  • Diferencias marcadas entre las operaciones de consulta y las de escritura. Si tu aplicación tiene muchas más consultas que escrituras, CQRS puede ser una gran ventaja.
  • Escenarios que requieran escalabilidad masiva. CQRS facilita la distribución de cargas de trabajo en sistemas grandes, como en aplicaciones basadas en microservicios.
  • Necesidad de flexibilidad en el manejo de datos. Si cada operación requiere diferentes modelos de datos o procesos, este patrón te permite manejar estos escenarios de manera efectiva.

¿Cuándo debes evitar el uso de CQRS?

Cuando lo uses vas a darte cuenta que, como agrega complejidad a la arquitectura de la aplicación, no te recomendamos que lo uses en aplicaciones simples. ¿Por qué? porque el costo de implementación puede superar los beneficios. Entonces, si tu aplicación realmente no necesita alta escalabilidad o no tiene diferencias significativas entre las operaciones de consulta y escritura, lo más probable es que tengas buenos resultados usando un enfoque más simple.

La idea es que sepas realmente cuándo te resultará beneficioso usar CQRS en la arquitectura de tu aplicación. Ya sabes que, si necesitas que tu aplicación tenga un manejo flexible de consultas y comandos, entonces podrás sacarle provecho a este patrón.

Si te interesa aprender más sobre patrones de arquitectura y cómo aplicarlos en el desarrollo de software, el Bootcamp Java Full Stack de KeepCoding es la opción perfecta para ti. En este programa intensivo, adquirirás las habilidades necesarias para dominar patrones como CQRS y muchas otras tecnologías avanzadas. ¡Apúntate y transforma tu carrera en el mundo del desarrollo con uno de los sectores más demandados y mejor pagados del mercado!

Ramón Maldonado

Full Stack Developer y Responsable de Formación base en KeepCoding.

Posts más leídos

¡CONVOCATORIA ABIERTA!

Java y Spring Boot

Full Stack Bootcamp

Clases en Directo | Profesores en Activo | Temario 100% actualizado