What is the concept of projection?

Proyecciones en Event Sourcing: Optimización de Lectura y Vistas de Datos

hace 10 años

★★★★★Valoración: 4.91 (4160 votos)

En el mundo del desarrollo de software, el patrón Event Sourcing se ha consolidado como una poderosa herramienta para construir sistemas robustos y auditables. Este enfoque se centra en registrar cada cambio en el estado de una aplicación como una secuencia de eventos inmutables. Pero, ¿cómo podemos consultar eficientemente la información en un sistema basado en eventos? Aquí es donde entran en juego las proyecciones.

What is the difference between model and projection?
While projections determine the long-term goals and expectations of the business, financial models help to make important business decisions. As an example, a revenue model within the financial model will show the inner workings of how the business will actually generate sales.
Índice de Contenido

¿Qué son las Proyecciones en Event Sourcing?

Imagina un extenso registro de eventos, cada uno documentando una acción que ha ocurrido en tu sistema. Si quisieras obtener una vista específica de los datos, como el saldo actual de una cuenta bancaria o la lista de pedidos pendientes, consultar directamente el registro de eventos para cada lectura sería extremadamente ineficiente. Las proyecciones, en este contexto, actúan como vistas materializadas que se construyen a partir del flujo de eventos. Son representaciones de los datos optimizadas para consultas de lectura específicas.

En esencia, una proyección es una transformación del flujo de eventos en una estructura de datos diferente, más adecuada para las necesidades de consulta de una parte particular de la aplicación. Piensa en ellas como bases de datos de lectura dedicadas, que se mantienen actualizadas procesando los eventos a medida que ocurren.

What is projection in event sourcing?
Projections. In Event Sourcing, Projections (also known as View Models or Query Models) provide a view of the underlying event-based data model. Often they represent the logic of translating the source write model into the read model. They are used in both read models and write models.

La Diferencia entre Modelo de Escritura y Proyección

Para comprender mejor el rol de las proyecciones, es crucial diferenciar entre el modelo de escritura y las proyecciones en un sistema Event Sourcing.

Modelo de Escritura: El Corazón de la Lógica de Negocio

El modelo de escritura es el responsable de manejar la lógica de negocio y procesar los comandos. En arquitecturas CQRS (Command Query Responsibility Segregation), es donde se gestionan los comandos que modifican el estado del sistema. El modelo de escritura se enfoca en:

  • Lógica de Dominio: Representa el dominio del negocio en código, incluyendo datos y métodos para modificarlos y validarlos. Se aleja del modelo anémico tradicional y abraza un modelo rico en comportamiento.
  • Consistencia de Datos: Utiliza patrones como Agregados para asegurar la consistencia transaccional de los datos relacionados. Un agregado define un límite transaccional, garantizando que todos los cambios dentro de él se apliquen de manera atómica.
  • Generación de Eventos: Cada operación exitosa en el modelo de escritura resulta en la emisión de uno o más eventos que describen el cambio que ha ocurrido. Por ejemplo, al emitir una factura, se generaría un evento como FacturaEmitida.

El texto proporcionado describe muy bien el modelo de escritura, especialmente el concepto de Agregado. Un agregado, como se menciona, es un conjunto de objetos asociados que se tratan como una unidad para cambios de datos. Tiene una raíz y un límite, y solo se permite a objetos externos referenciar la raíz. Esto ayuda a mantener la consistencia y encapsular la lógica de negocio.

What are project events?
Project events are the events that are linked to a particular project or workfolder. In GoodDay, you can create 3 types of project events: deadline, milestone, and event.

Proyecciones: Vistas Optimizadas para Lectura

Mientras que el modelo de escritura se centra en la lógica de negocio y la generación de eventos, las proyecciones se encargan de la optimización de la lectura. Las proyecciones consumen el flujo de eventos generado por el modelo de escritura y crean vistas de datos específicas para diferentes necesidades de consulta. En contraste con el modelo de escritura, las proyecciones:

  • Están Optimizadas para Consultas: Se diseñan para responder eficientemente a preguntas específicas. Pueden utilizar diferentes estructuras de datos, como bases de datos relacionales, bases de datos NoSQL o incluso índices en memoria, dependiendo de los requisitos de rendimiento y el tipo de consulta.
  • Son Derivadas del Modelo de Escritura: Se construyen exclusivamente a partir de los eventos generados por el modelo de escritura. No contienen lógica de negocio en sí mismas, sino que reflejan el estado del sistema según los eventos procesados.
  • Permiten Vistas Personalizadas: Diferentes partes de la aplicación pueden requerir diferentes vistas de los datos. Las proyecciones permiten crear múltiples vistas adaptadas a las necesidades específicas de cada componente. Por ejemplo, una interfaz de usuario para clientes puede necesitar una vista diferente de los datos que un panel de administración.

Volviendo al ejemplo de la factura mencionado en el contexto del modelo de escritura, podríamos tener diferentes proyecciones:

  • Proyección de Listado de Facturas: Optimizado para mostrar un listado de facturas con información básica como número de factura, cliente, fecha y estado. Podría almacenarse en una base de datos relacional indexada por fecha y cliente para búsquedas rápidas.
  • Proyección de Detalles de Factura: Diseñado para mostrar todos los detalles de una factura específica. Podría utilizar una estructura de datos que facilite la recuperación rápida de todos los campos relacionados con una factura en particular.
  • Proyección de Saldo Pendiente por Cliente: Calcula y almacena el saldo pendiente de pago para cada cliente. Esta proyección se actualizaría con eventos de FacturaEmitida y PagoRecibido, permitiendo consultar rápidamente el saldo de un cliente sin tener que recalcularlo desde el inicio.

¿Por Qué Usar Proyecciones?

El uso de proyecciones en Event Sourcing ofrece múltiples ventajas:

  • Rendimiento de Lectura Mejorado: Al tener vistas de datos precalculadas y optimizadas, las consultas de lectura son mucho más rápidas y eficientes que consultar directamente el registro de eventos.
  • Desacoplamiento: Las proyecciones desacoplan el modelo de escritura del modelo de lectura. Los cambios en el modelo de escritura no necesariamente impactan las proyecciones, y viceversa, lo que permite una mayor flexibilidad y evolución independiente de diferentes partes del sistema.
  • Vistas de Datos Personalizadas: Permiten crear vistas de datos específicas para diferentes casos de uso, optimizando la experiencia del usuario y facilitando el desarrollo de interfaces de usuario y reportes.
  • Escalabilidad de Lectura: Las proyecciones pueden escalarse independientemente del modelo de escritura. Se pueden utilizar diferentes tecnologías de almacenamiento y estrategias de replicación para las proyecciones según las necesidades de rendimiento y disponibilidad de lectura.

Consideraciones al Implementar Proyecciones

Si bien las proyecciones son una herramienta poderosa, hay algunas consideraciones importantes a tener en cuenta al implementarlas:

  • Consistencia Eventual: Las proyecciones suelen ser eventualmente consistentes con el modelo de escritura. Esto significa que puede haber un pequeño retraso entre la ocurrencia de un evento y su reflejo en las proyecciones. Es importante comprender y gestionar esta consistencia eventual en la aplicación.
  • Complejidad de Implementación: Implementar y mantener proyecciones puede añadir cierta complejidad al sistema. Se requiere lógica para procesar los eventos y actualizar las proyecciones de manera eficiente y confiable.
  • Selección de Tecnología de Almacenamiento: La elección de la tecnología de almacenamiento para las proyecciones debe basarse en los requisitos de rendimiento, escalabilidad y tipo de consultas que se realizarán.

Proyecciones vs. Modelos Financieros: Una Analogía Útil

El texto proporcionado sobre modelos y proyecciones financieras, aunque en un contexto diferente, ofrece una analogía interesante. Las proyecciones financieras son estáticas, predicciones del futuro basadas en suposiciones. En Event Sourcing, podríamos ver un paralelismo (aunque no perfecto) con una vista puntual de los datos en un momento específico, una instantánea. Por otro lado, los modelos financieros son dinámicos e interactivos, permitiendo simular diferentes escenarios. Esto podría asemejarse más al sistema Event Sourcing en sí mismo, con su capacidad de reconstruir estados pasados y proyectar futuros basados en la secuencia de eventos.

Sin embargo, la analogía más precisa sería comparar las proyecciones de Event Sourcing con los resultados que se obtienen al aplicar un modelo financiero. Las proyecciones financieras generan informes específicos basados en el modelo, al igual que las proyecciones en Event Sourcing generan vistas de datos específicas basadas en el flujo de eventos.

What is projection in event sourcing?
Projections. In Event Sourcing, Projections (also known as View Models or Query Models) provide a view of the underlying event-based data model. Often they represent the logic of translating the source write model into the read model. They are used in both read models and write models.

Conclusión

Las proyecciones son un componente esencial en sistemas basados en Event Sourcing. Permiten optimizar las consultas de lectura, desacoplar el modelo de escritura del modelo de lectura, y crear vistas de datos personalizadas para diferentes necesidades. Al comprender y utilizar eficazmente las proyecciones, se pueden construir sistemas Event Sourcing más eficientes, escalables y adaptables a las demandas del negocio. Si bien requieren una cuidadosa implementación y consideración de la consistencia eventual, los beneficios que aportan en términos de rendimiento y flexibilidad son significativos.

Preguntas Frecuentes (FAQ)

  1. ¿Son siempre necesarias las proyecciones en Event Sourcing?
    No siempre son estrictamente necesarias, pero son altamente recomendables para la mayoría de los casos de uso, especialmente cuando se requiere un alto rendimiento de lectura y vistas de datos personalizadas. Sin proyecciones, las consultas de lectura directamente al registro de eventos pueden volverse ineficientes.
  2. ¿Qué tipos de bases de datos son adecuadas para almacenar proyecciones?
    La elección depende de los requisitos de la proyección. Bases de datos relacionales (SQL), bases de datos NoSQL (como MongoDB, Cassandra), o incluso soluciones en memoria (como Redis) pueden ser adecuadas, dependiendo del tipo de consultas y la escala requerida.
  3. ¿Cómo se actualizan las proyecciones?
    Las proyecciones se actualizan procesando el flujo de eventos. Un proceso de escucha de eventos consume los eventos a medida que se producen y actualiza las vistas de datos correspondientes en las bases de datos de proyección.
  4. ¿Qué pasa si una proyección falla en actualizarse?
    Es importante diseñar mecanismos de resiliencia y reintento para el proceso de actualización de proyecciones. En caso de fallo, se debe intentar reprocesar los eventos para asegurar la consistencia de las proyecciones. También es importante monitorizar la salud de las proyecciones y alertar en caso de problemas.
  5. ¿Puedo tener múltiples proyecciones para el mismo flujo de eventos?
    ¡Sí! Una de las grandes ventajas de las proyecciones es que puedes tener tantas como necesites, cada una optimizada para un caso de uso específico. Cada proyección consumirá el mismo flujo de eventos pero generará una vista de datos diferente.

Subir