10 puntos por tothefullest08 2025-04-05 | 1 comentarios | Compartir por WhatsApp

Introducción

La charla de Won Ji-hyeok sobre event sourcing en el meetup de servidores de Karrot me ayudó mucho a entender este concepto. Organicé los conceptos básicos de event sourcing y, con base en la presentación, hice una implementación sencilla de un servicio de configuración basado en NestJS, TypeScript y MongoDB.

Conceptos básicos de event sourcing

  • A diferencia del enfoque CRUD tradicional, registra todos los cambios de estado como eventos inmutables, lo que facilita la auditoría y el rollback
  • Al igual que un libro contable, registra todas las transacciones (eventos) en secuencia, por lo que el estado actual puede reconstruirse en cualquier momento

Componentes clave

  • Evento
    • Incluye ID único, hora de creación, tipo de evento, información del usuario y contenido (body), y garantiza inmutabilidad y autosuficiencia
  • Estado
    • Estado final calculado al reproducir todos los eventos (con snapshots o caché cuando sea necesario)
  • Reducer
    • Una función pura que recibe el estado anterior y un evento para calcular el nuevo estado, manteniendo la inmutabilidad
  • Entidad
    • Agrupa eventos relacionados y los administra como un solo objeto, lo que permite consultar de forma eficiente el historial de cambios de una entidad específica

Ejemplo de implementación y estructura

  • Configuración básica del entorno: usar NestJS para ejecutar la aplicación
  • Definición de entidades y eventos
    • Uso de interfaces de TypeScript y esquemas de MongoDB para definir con claridad varios eventos (por ejemplo, creación de configuración, adición/eliminación de parámetros) y objetos de estado
  • Implementación del reducer:
    • Escribir funciones puras que actualicen el estado según el tipo de evento para obtener el estado final reproduciendo la secuencia de eventos
  • Endpoints de API y capa de servicio
    • Implementación de una REST API que ofrece funciones para crear configuraciones, consultarlas y agregar/eliminar parámetros
    • Uso del patrón dispatch-commit para procesar en secuencia la publicación del evento, el cálculo del estado y el almacenamiento del evento

Mejoras adicionales e integración con sistemas externos

  • Interfaces genéricas
    • Diseño de un repositorio de eventos reutilizable para reducir la duplicación de código y asegurar type safety
  • Event handlers
    • Integración con sistemas externos como Slack para ejecutar procesos adicionales, como enviar notificaciones cuando ocurren eventos
  • Estrategias de optimización de rendimiento
    • Snapshots: guardar el estado en un momento específico y aplicar solo los eventos posteriores, reduciendo el costo de reproducir todos los eventos
    • Caché: usar caché en memoria o Redis para ofrecer rápidamente el estado de entidades consultadas con frecuencia

Conclusión

  • Event sourcing es una arquitectura poderosa que registra con claridad todo el historial de cambios, mejorando la confiabilidad y la mantenibilidad
  • Debe adoptarse con cuidado, considerando la curva de aprendizaje, y acompañarse de una adopción gradual acorde al dominio junto con estrategias de optimización como snapshots y caché para asegurar el rendimiento del sistema

1 comentarios

 
guseod24 2025-04-06

¡Muy bien! ^0^