Estado: Aceptado
Fecha: 2025-11-14
Decisores: Equipo de Arquitectura
En una arquitectura de microservicios, debemos decidir cómo gestionar la persistencia de datos. La decisión afecta el acoplamiento entre servicios, la escalabilidad y la autonomía de cada equipo.
Cada microservicio tendrá su propia base de datos independiente. No se permitirá acceso directo a la base de datos de otro servicio.
- Independencia: Cada servicio puede elegir la tecnología de BD más apropiada
- Escalabilidad: Cada base de datos puede escalar independientemente
- Despliegue Independiente: No hay riesgo de bloqueos de esquema entre servicios
- Aislamiento de Fallos: Problemas en una BD no afectan otros servicios
- Autonomía de Equipos: Cada equipo gestiona su esquema sin coordinación
- Joins Distribuidos: No se pueden hacer JOINs entre servicios
- Transacciones Distribuidas: Requiere implementar Saga pattern
- Consistencia Eventual: No hay consistencia inmediata entre servicios
- Duplicación de Datos: Puede haber duplicación necesaria
- Complejidad en Queries: Queries que abarcan múltiples servicios son complejas
- Rechazado: Alto acoplamiento
- Dificultad para escalar independientemente
- Riesgo de modificaciones que afecten múltiples servicios
- Cuellos de botella
- Rechazado: Acoplamiento a nivel de esquema
- Dificulta migraciones independientes
- Rechazado: No proporciona suficiente aislamiento
- Equipos diferentes compartiendo recursos
- Cada servicio es verdaderamente independiente
- Equipos pueden optimizar su almacenamiento según necesidades
- Migraciones de esquema sin coordinación entre equipos
- Posibilidad de usar diferentes tecnologías (SQL Server, PostgreSQL, MongoDB, etc.)
- Necesidad de implementar Saga pattern para transacciones distribuidas
- Reporting cross-service requiere soluciones específicas (CQRS, Data Warehouse)
- Mayor complejidad en operaciones
- Costos de infraestructura potencialmente más altos
Orders API:
- Database:
OrdersDB(SQL Server) - Tablas: Orders, OrderItems, OrderHistory
- No expone acceso directo a otros servicios
Inventory API:
- Database:
InventoryDB(SQL Server) - Tablas: Products, Stock, Reservations
- Gestiona su propio estado de inventario
Payments API:
- Database:
PaymentsDB(SQL Server) - Tablas: Transactions, PaymentMethods, Refunds
- Datos sensibles aislados
Notifications API:
- Database:
NotificationsDB(SQL Server) - Tablas: NotificationLog, Templates, Preferences
- Historia de notificaciones enviadas
- API Composition: Servicio compone respuesta llamando a múltiples APIs
- CQRS: Read models específicos mantenidos mediante eventos
- Data Warehouse: Para analytics y reporting
- BFF Pattern: Backend for Frontend que agrega datos
Usar Saga Pattern con compensación:
Orden de ejecución:
1. Orders: Crear orden
2. Inventory: Reservar stock (compensable)
3. Payments: Procesar pago (compensable)
4. Orders: Confirmar orden
En caso de fallo:
- Payments falla → Inventory libera → Orders cancela
- Cada servicio gestiona sus propias migraciones
- Usar Entity Framework Migrations / Flyway
- Versionado de esquema independiente
- No se permite DDL cross-database
- Estrategia de backup por base de datos
- RPO y RTO pueden variar por servicio según criticidad
- Testing de recuperación independiente