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: