Taller 2: Migración a Microser‐vicios (Strangler Pattern) - AlejandroCifuentes25/CarFit GitHub Wiki
Diagrama de clases
Teniendo en cuenta este diagrama de clases inicial:
Matriz de decisión
Se extrajeron los principales módulos del dominio y se hizo la siguiente matriz de priorización para saber qué servicio migrar a Flask:
Decisión: Migrar el módulo de pagos
Justificación: Este módulo es altamente propenso a cambios, en la medida en que depende de un tercero responsable de ellos y de los posibles cambios de dominio que se propongan para él. Adicionalmente, si se considera la ganancia de pasar este servicio a Flask, se evidencia que es más beneficioso por la carga de CPU que tiene y la disponibilidad que necesita.
Es importante mencionar que, a pesar de que hubo otro módulo con las mismas características (propenso a migración) por el avance actual del proyecto y las prioridades del mismo se decidió migrar el modulo de pagos.
Impacto esperado en el sistema
Esto transformara CarFit en un sistema mas robusto pero también mas complejo. Se obtendrá resiliencia y un manejo de excepcionalidades, por ejemplo, si algún modulo colapsa, el microservicio de Flask seguirá funcionando y procesando transacciones, así permitiendo proteger las credenciales financieras en un entorno cerrado. Por otro lado, se asumirán nuevos retos técnicos, debido a que la comunicación interna añadirá una latencia de red, el rastreo de errores exigirá revisar logs en dos aplicaciones distintas.
Justificación separación técnica
Con flask no tenemos la necesidad de migrar el frontend y crear una base de datos individual a la que ya se tiene en django. Esto nos conviene para tener una migración no tan compleja ayudándonos de tecnologías como Nginx y solo dejando la lógica que se tiene de un módulo con flask, ayudando a una mejora de eficiencia en el proyecto.
Diagrama de la nueva arquitectura
flowchart TD
classDef proxy fill:#4A4A4A,color:white,stroke:#333,stroke-width:2px;
classDef django fill:#092E20,color:white,stroke:#44b78b,stroke-width:2px;
classDef flask fill:#FFFFFF,color:black,stroke:#000000,stroke-width:2px;
classDef db fill:#336791,color:white,stroke:#fff,stroke-width:2px;
classDef external fill:#ddd,stroke:#333,stroke-dasharray: 5 5;
Cliente((Usuario / Cliente HTTP))
Nginx{"Nginx - API Gateway"}:::proxy
subgraph Ecosistema_CarFit
direction TB
Django["Monolito Django\nPuerto Interno 8000"]:::django
Flask["Microservicio Flask\nPuerto Interno 5000"]:::flask
DB[("Base de Datos\nPostgreSQL")]:::db
end
Pasarelas["Pasarelas de Pago Externas\nPSE, Redeban, etc."]:::external
Cliente -->|Peticiones entrantes Puerto 80| Nginx
Nginx ==>|"Rutas Legacy: /api/v1/*, /*"| Django
Nginx ==>|"Tráfico Estrangulado: /api/v2/pagos/*"| Flask
Django -.->|"1. Petición HTTP interna\npara delegar cobro del carrito"| Flask
Flask -.->|"2. Respuesta JSON\nestatus del pago"| Django
Django -->|Lectura y Escritura| DB
Flask -->|Lectura y Escritura| DB
Flask <-->|"Llamadas API seguras y Webhooks"| Pasarelas
Evidencia de funcionamiento: