De la teoría a la práctica del event sourcing: implementar un servicio de remote config con NestJS
(borntodare.me)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.
- Original: Crear una plataforma interna escalable usando event sourcing | Karrot SERVER Meetup #2
- Código fuente de ejemplo del servicio de configuración con event sourcing
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
- Incluye ID único, hora de creación, tipo de evento, información del usuario y contenido (
- 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
¡Muy bien! ^0^