# CorrecciΓ³n: MongoDB Separado por Microservicio **Fecha:** 29 de Abril de 2026 **Cambio:** Arquitectura actualizada a instancias independientes de MongoDB --- ## πŸ“‹ Cambio Realizado Se corrigiΓ³ la arquitectura para que **cada microservicio tenga su propia instancia de MongoDB** completamente separada. ### Antes ❌ ``` β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ MongoDB (Instancia Única) β”‚ β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€ β”‚ Base de datos: reports β”‚ β”‚ Base de datos: notifications β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ ↑ Compartida entre servicios ``` ### Ahora βœ… ``` β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ MongoDB Reports β”‚ ← Puerto 27017 β”‚ (Instancia 1) β”‚ β”‚ BD: voxpopuli_reports β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ API Reportes β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ MongoDB Notifications β”‚ ← Puerto 27018 β”‚ (Instancia 2) β”‚ β”‚ BD: voxpopuli_notifications β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ API Notificaciones ``` --- ## πŸ”§ Cambios Realizados ### 1. `docker-compose.yaml` **Antes:** Una ΓΊnica instancia `mongodb` **Ahora:** Dos instancias separadas ```yaml mongodb-reports: image: mongo:7.0 container_name: voxpopuli_mongo_reports ports: - "27017:27017" # Puerto especΓ­fico para reportes volumes: - mongo_reports_data:/data/db mongodb-notifications: image: mongo:7.0 container_name: voxpopuli_mongo_notifications ports: - "27018:27017" # Puerto especΓ­fico para notificaciones (mapea al 27017 interno) volumes: - mongo_notifications_data:/data/db ``` **VolΓΊmenes:** ```yaml volumes: mysql_data: mongo_reports_data: # Nuevo mongo_notifications_data: # Nuevo rabbitmq_data: ``` ### 2. `src/core/config.py` **Antes:** ```python mongodb_url: str = "mongodb://localhost:27017" mongodb_db: str = "voxpopuli_reports" mongodb_notifications_db: str = "voxpopuli_notifications" ``` **Ahora:** ```python # Instancia 1: Reportes mongodb_reports_url: str = "mongodb://admin:admin_password@localhost:27017" mongodb_reports_db: str = "voxpopuli_reports" # Instancia 2: Notificaciones mongodb_notifications_url: str = "mongodb://admin:admin_password@localhost:27018" mongodb_notifications_db: str = "voxpopuli_notifications" ``` ### 3. `src/infrastructure/adapters/persistence/mongodb.py` **Antes:** ```python mongo_client = MongoClient(ConfSettings.mongodb_url) mongodb = mongo_client[ConfSettings.mongodb_db] def get_reports_collection() -> Collection: return mongodb["reportes"] ``` **Ahora:** ```python # Cliente separado para Reportes (Puerto 27017) mongo_client_reports = MongoClient(ConfSettings.mongodb_reports_url) mongodb_reports = mongo_client_reports[ConfSettings.mongodb_reports_db] # Cliente separado para Notificaciones (Puerto 27018) mongo_client_notifications = MongoClient(ConfSettings.mongodb_notifications_url) mongodb_notifications = mongo_client_notifications[ConfSettings.mongodb_notifications_db] def get_reports_collection() -> Collection: return mongodb_reports["reportes"] def get_notifications_collection() -> Collection: return mongodb_notifications["notificaciones"] ``` ### 4. `src/infrastructure/adapters/persistence/notification_repository_mongo.py` **Cambio:** Usar la funciΓ³n `get_notifications_collection()` centralizada en lugar de crear el cliente localmente ```python from infrastructure.adapters.persistence.mongodb import get_notifications_collection class NotificationRepositoryMongo(NotificationRepository): def __init__(self): self.collection = get_notifications_collection() # Usa instancia separada ``` --- ## πŸ“Š Arquitectura Final ``` β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ VoxPopuli Services β”‚ β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€ β”‚ β”‚ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ β”‚ β”‚ Usuarios β”‚ β”‚ Reportes β”‚ β”‚Notificacioβ”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚nes β”‚ β”‚ β”‚ β”‚ Puerto 8000 β”‚ β”‚ Puerto 8001 β”‚ β”‚ Puerto... β”‚ β”‚ β”‚ β””β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”˜ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ ↓ ↓ ↓ β”‚ β”‚ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ β”‚ β”‚ MySQL β”‚ β”‚ MongoDB β”‚ β”‚ MongoDB β”‚ β”‚ β”‚ β”‚ (Usuarios) β”‚ β”‚ Reports β”‚ β”‚ Notif. β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ β”‚ Puerto 3306 β”‚ β”‚ Puerto 27017 β”‚ β”‚ Puerto... β”‚ β”‚ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ β”‚ β”‚ β”‚ β”‚ Instancias β”‚ β”‚ Independientes β”‚ β”‚ β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ ↓ β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β” β”‚ RabbitMQ β”‚ β”‚ (Compartida) β”‚ β”‚ Puerto 5672 β”‚ β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜ ``` --- ## πŸš€ CΓ³mo Levantar ```bash # Levantar todos los servicios con instancias separadas docker-compose up -d # Verificar que ambas instancias de MongoDB estΓ‘n corriendo docker-compose ps # Resultado esperado: # voxpopuli_mysql Up (healthy) # voxpopuli_mongo_reports Up (healthy) Puerto 27017 # voxpopuli_mongo_notifications Up (healthy) Puerto 27018 # voxpopuli_rabbitmq Up (healthy) ``` --- ## πŸ”Œ Puertos Finales | Servicio | Contenedor | Puerto Externo | Puerto Interno | |----------|-----------|-----------------|-----------------| | MySQL | voxpopuli_mysql | 3306 | 3306 | | MongoDB (Reports) | voxpopuli_mongo_reports | 27017 | 27017 | | MongoDB (Notifications) | voxpopuli_mongo_notifications | 27018 | 27017 | | RabbitMQ AMQP | voxpopuli_rabbitmq | 5672 | 5672 | | RabbitMQ Management | voxpopuli_rabbitmq | 15672 | 15672 | --- ## πŸ§ͺ Verificar SeparaciΓ³n ### Conectar a MongoDB Reports ```bash docker exec -it voxpopuli_mongo_reports mongosh \ -u admin -p admin_password \ --authenticationDatabase admin # En la terminal de MongoDB: use voxpopuli_reports db.reportes.find() # Solo verΓ‘ reportes ``` ### Conectar a MongoDB Notifications ```bash docker exec -it voxpopuli_mongo_notifications mongosh \ -u admin -p admin_password \ --authenticationDatabase admin # En la terminal de MongoDB: use voxpopuli_notifications db.notificaciones.find() # Solo verΓ‘ notificaciones ``` --- ## βœ… Beneficios de esta Arquitectura 1. **Aislamiento Completo** - Cada servicio es totalmente independiente 2. **Escalabilidad** - Escalar reportes sin afectar notificaciones (y viceversa) 3. **Backup Independiente** - Backups separados por tipo de dato 4. **Seguridad** - Credenciales y acceso separados 5. **Performance** - Sin contenciΓ³n de recursos entre servicios 6. **Mantenibilidad** - MΓ‘s fΓ‘cil de mantener y depurar 7. **High Availability** - Una BD puede fallar sin afectar la otra --- ## πŸ“ Variables de Entorno (Opcional) Si necesitas cambiar los puertos en producciΓ³n: ```bash # .env MONGODB_REPORTS_URL=mongodb://admin:password@mongo-reports:27017 MONGODB_NOTIFICATIONS_URL=mongodb://admin:password@mongo-notifications:27017 ``` Luego actualizar en `config.py`: ```python mongodb_reports_url: str = Field( default=os.getenv("MONGODB_REPORTS_URL", "...") ) mongodb_notifications_url: str = Field( default=os.getenv("MONGODB_NOTIFICATIONS_URL", "...") ) ``` --- ## 🎯 Resumen βœ… Cada microservicio tiene su **propia instancia de MongoDB** βœ… Datos completamente aislados βœ… Puertos independientes (27017 y 27018) βœ… Conexiones separadas en cΓ³digo βœ… ConfiguraciΓ³n centralizada βœ… Totalmente escalable --- **Cambio Completado: Arquitectura microservicios con MongoDB independiente por servicio βœ…**