Estado: Aceptado
Fecha: 2025-11-14
Decisores: Equipo de Arquitectura
Necesitamos diseñar un sistema de e-commerce distribuido que soporte múltiples microservicios. Los servicios deben comunicarse entre sí de manera eficiente, manteniendo bajo acoplamiento y alta cohesión.
Implementaremos una arquitectura orientada a eventos (Event-Driven Architecture) utilizando un message broker centralizado (RabbitMQ o Azure Service Bus) para la comunicación entre microservicios.
- Desacoplamiento: Los servicios no necesitan conocerse entre sí directamente
- Escalabilidad: Cada servicio puede escalar independientemente
- Resiliencia: Si un servicio está caído, los eventos se encolan y procesan cuando se recupera
- Auditoría: Todos los eventos pueden ser almacenados para auditoría
- Evolución: Nuevos servicios pueden suscribirse a eventos existentes sin modificar productores
- Consistencia Eventual: Aceptable para nuestro dominio de negocio
- Complejidad: Mayor complejidad en debugging y testing
- Consistencia: No hay transacciones ACID entre servicios
- Latencia: Mayor latencia que llamadas síncronas
- Duplicación: Posibilidad de procesamiento duplicado (requiere idempotencia)
- Ordenamiento: No se garantiza orden global de eventos
- Rechazado: Alto acoplamiento entre servicios
- Cascada de fallos
- Difícil escalabilidad
- Rechazado: Aunque más eficiente que REST, mantiene acoplamiento directo
- No resuelve problemas de resiliencia
- Rechazado: Complejidad adicional
- No elimina acoplamiento temporal
- Los servicios pueden desarrollarse y desplegarse independientemente
- Fácil agregar nuevos consumidores de eventos
- Mejor resiliencia del sistema completo
- Facilita implementación de patterns como CQRS y Event Sourcing
- Requiere infraestructura adicional (message broker)
- Necesidad de implementar idempotencia en todos los handlers
- Debugging más complejo (requiere distributed tracing)
- Equipo debe aprender nuevos patrones (Saga, compensación, etc.)
- Seleccionar y configurar message broker (RabbitMQ/Azure Service Bus)
- Implementar abstracciones comunes en BIT components
- Establecer convenciones de nombrado para eventos
- Implementar infraestructura de logging y tracing
- Crear tests de integración para flujos de eventos
- Documentar todos los eventos en catálogo central
- Cada evento debe ser inmutable
- Los eventos deben contener toda la información necesaria (no lazy loading)
- Implementar versionado de eventos desde el inicio
- Considerar Event Sourcing para servicios que requieren auditoría completa