12-09-2022

Cqrs: qué es y cómo funciona este patrón

CQRS (Command Query Responsibility Segregation) es un patrón arquitectónico que separa las operaciones de lectura (queries) de las operaciones de escritura (commands) en un sistema, asignándolas a modelos diferentes. Este enfoque mejora la escalabilidad, el rendimiento y la mantenibilidad de aplicaciones, especialmente en sistemas complejos o de alta carga.

Conceptos Clave

  • Command: Operaciones que modifican el estado del sistema (ej. crear, actualizar o eliminar datos, como crear un usuario o actualizar un producto).
  • Query: Operaciones que leen datos sin alterar el estado (como obtener una lista de usuarios o detalles de un producto).
  • Separación: En lugar de usar un solo modelo de datos para lecturas y escrituras (como en CRUD tradicional), CQRS utiliza dos modelos:
    • Modelo de escritura: Optimizado para actualizaciones consistentes, validaciones y lógica de negocio.
    • Modelo de lectura: Optimizado para consultas rápidas, a menudo con vistas desnormalizadas para mayor eficiencia.
  • Objetivo: Dividir responsabilidades para que cada modelo pueda escalar de forma independiente y optimizarse según su propósito.

Ventajas

  1. Escalabilidad: Puedes escalar los sistemas de lectura y escritura por separado (ej. más instancias para lecturas si son más frecuentes).
  2. Rendimiento: El modelo de lectura puede usar estructuras de datos optimizadas (ej. bases de datos NoSQL para consultas rápidas).
  3. Flexibilidad: Permite usar tecnologías diferentes para cada modelo (ej. MySQL para escritura, Elasticsearch para lectura).
  4. Mantenibilidad: La lógica de negocio (en comandos) se separa de las consultas, simplificando el código.

Desventajas

  1. Complejidad: Implementar dos modelos aumenta la complejidad del sistema, especialmente en sincronización de datos.
  2. Consistencia eventual: Las lecturas y escrituras pueden estar en bases de datos separadas, lo que implica que los datos leídos no siempre están actualizados al instante.
  3. Costo de desarrollo: Requiere más esfuerzo inicial para diseñar y mantener los dos modelos.
Ejemplo de CQRS en php