Files
VoxPopuli/ARCHITECTURE.md
2026-03-16 21:05:52 -06:00

248 lines
7.6 KiB
Markdown

# Arquitectura de VoxPopuli Microservices
## Patrones Arquitectónicos Usados
### 1. Clean Architecture (Arquitectura Limpia)
La aplicación está organizada en capas independientes:
```
┌─────────────────────────────────────────────────────────┐
│ API REST (FastAPI) │
│ Infraestructura API (HTTP Handlers) │
├─────────────────────────────────────────────────────────┤
│ Application Layer (Servicios) │
│ - Use Cases / Application Services │
│ - Lógica de negocio de la aplicación │
├─────────────────────────────────────────────────────────┤
│ Domain Layer (Dominio) │
│ - Entidades de negocio puras │
│ - Reglas de negocio independientes │
├─────────────────────────────────────────────────────────┤
│ Infrastructure Layer (Infraestructura) │
│ - Adaptadores (Repositorios) │
│ - Acceso a Datos (MySQL, MongoDB) │
└─────────────────────────────────────────────────────────┘
```
### 2. Microservicios
Dos microservicios independientes:
- **Usuarios API** (Puerto 8000) - Gestión de usuarios y credenciales
- **Reportes API** (Puerto 8001) - Gestión de reportes comunitarios
Cada microservicio:
- Tiene su propia base de datos
- Es escalable independientemente
- Se puede desplegar por separado
- Expone su propia API REST
### 3. Patrón Repository
Abstracción para acceso a datos:
```
┌──────────────────┐
│ Service Layer │
└────────┬─────────┘
│ depends on
┌──────────────────────────┐
│ Port (Interface) │
│ UserRepository │
│ ReportRepository │
└────────┬─────────────────┘
│ implemented by
┌──────────────────────────┐
│ Concrete Adapters │
│ UserRepositorySQL │
│ ReportRepositoryMongo │
└──────────────────────────┘
```
**Beneficios:**
- Independencia de la implementación de BD
- Fácil de testear (usar mocks)
- Reutilizable en diferentes contextos
### 4. Inversión de Dependencias (Dependency Inversion)
Los servicios dependen de **abstracciones (interfaces)**, no de implementaciones concretas:
```python
class CreateUser:
def __init__(self, repo: UserRepository): # Depende de interfaz
self.repo = repo
# Puede usar cualquier implementación de UserRepository
service = CreateUser(UserRepositorySQL()) # Implementación SQL
# o
service = CreateUser(UserRepositoryMock()) # Para testing
```
## Flujo de Solicitud
### Crear Usuario:
```
1. HTTP POST /users/
└─> FastAPI Handler
└─> CreateUser Use Case
└─> UserRepository.save()
└─> UserRepositorySQL
└─> SQLAlchemy
└─> MySQL Database
```
### Crear Reporte:
```
1. HTTP POST /reports/
└─> FastAPI Handler
└─> CreateReport Use Case
└─> ReportRepository.save()
└─> UserRepository.increment_reports()
└─> ReportRepositoryMongo
└─> UserRepositorySQL
└─> MongoDB
└─> MySQL
```
## Capas Detalladas
### Domain Layer (src/domain/)
**Entidades puras de negocio**:
- `User`: Representa un usuario del sistema
- `Report`: Representa un reporte comunitario
No tienen dependencias externas. Solo representan conceptos de negocio.
```python
@dataclass
class User:
user_id: int
nombre: str
email: str
# ... más campos
```
### Application Layer (src/application/)
**Use Cases y Servicios**:
#### Ports (Interfaces):
- `UserRepository`: Contrato para acceso a datos de usuarios
- `ReportRepository`: Contrato para acceso a datos de reportes
#### Services (Use Cases):
- `CreateUser`, `GetUserById`, `UpdateUser`, `DeleteUser`
- `CreateReport`, `GetReportById`, `UpdateReportVisibility`
Contienen la lógica de negocio:
```python
class CreateReport:
def execute(self, id_usuario, tipo_reporte, ...):
# 1. Validar que usuario existe
user = self.user_repo.find_by_id(id_usuario)
# 2. Crear reporte
report = Report(...)
# 3. Guardar en BD
self.repo.save(report)
# 4. Actualizar contador de usuario
self.user_repo.increment_reports(id_usuario)
```
### Infrastructure Layer (src/infrastructure/)
#### Persistence Adapters:
**user_repository_sql.py**:
- Implementa `UserRepository` usando SQLAlchemy
- Convierte entre modelo de dominio y modelo de BD
**report_repository_mongo.py**:
- Implementa `ReportRepository` usando PyMongo
- Convierte entre modelo de dominio y documento MongoDB
#### API Handlers:
**users/users.py**:
- Endpoints HTTP para gestión de usuarios
- Usa esquemas Pydantic para validación
**reports/reports.py**:
- Endpoints HTTP para gestión de reportes
- Mapeo de solicitudes a use cases
### Core Layer (src/core/)
Configuración centralizada:
- Variables de entorno
- Configuración de logging
- Configuración de bases de datos
## Testing
La arquitectura facilita el testing:
```python
# Mock Repository para testing
class UserRepositoryMock(UserRepository):
def __init__(self):
self.users = {}
def save(self, user):
self.users[user.user_id] = user
return user
# Usar en tests
def test_create_user():
mock_repo = UserRepositoryMock()
service = CreateUser(mock_repo)
user = service.execute(...)
assert mock_repo.users[1] is not None
```
## Escalabilidad
Cada componente puede escalar independientemente:
1. **Usuarios API**: Escalar horizontal con load balancer
2. **Reportes API**: Escalar horizontal con load balancer
3. **MySQL**: Replicación master-slave
4. **MongoDB**: Sharding automático
## Despliegue
Cada microservicio puede desplegarse:
- **Docker**: Contenedores independientes
- **Kubernetes**: Pods independientes
- **Serverless**: Funciones Lambda independientes
## Monitoreo
Cada API expone:
- `/health` - Health check
- `/docs` - Swagger UI
- Logging estructurado
- Métricas por endpoint
## Futuras Mejoras
1. **Autenticación**: JWT tokens en API
2. **Autorización**: RBAC (Role-Based Access Control)
3. **Rate Limiting**: Proteger contra abuso
4. **Caché**: Redis para datos frecuentes
5. **Message Queue**: RabbitMQ para comunicación asíncrona
6. **Logging Centralizado**: ELK Stack
7. **Observabilidad**: Prometheus + Grafana
8. **Tracing**: Jaeger para rastreo de solicitudes