Codea Seguro Codea Seguro
Arquitectura de Software Nivel: basic Arquitectura Software

No se pueden vender entradas

Ejercicio practico nivel basico de entrevista para Arquitecto de Software el sistema colapsa cuando se disponibilizan para la venta entradas e ingresan muchos usuarios al mismo tiempo. No pueden concretar su compra.

Un ejercicio típico de entrevista de Arquitectura de software para un perfil base, con respuestas modelo.

Planteo del problema

Tenemos el siguiente problema en nuestro sistema de ventas de entradas para conciertos. Y contamos con el servicio de codeaseguro para poder analizar la arquitectura actual y proponer la adecuada para resolver el inconveniente.

Problemática: El dia que se habilita la venta de entradas el sistema termina colapsando porque ingresan muchos usuarios al mismo tiempo, la aplicación se cae y nadie puede comprar.

Arquitectura actual

flowchart LR

    subgraph arq["Arquitectura actual"]
        direction LR
        roadmap["<b>Users</b><br/>"]
        web["Web de entradas"]
        servidor["Servidor"]
        db[("Base de datos")]

        roadmap --> web
        web --> servidor
        servidor --> db
    end
    style web fill:#e53935,stroke:#b71c1c,color:#fff
    style db fill:#e53935,stroke:#b71c1c,color:#fff
    

Solución propuesta

Lo que detectamos

Analizando la arquitectura actual podemos detectar que:

  • El sistema cuenta con un solo servidor que procesa toda la informacion y consulta a la base de datos.
  • El sistema escaló y debe soportar concurrencia en momentos picos, ej: Cuando los usuarios ingresan todos al mismo tiempo para sacar entradas.
  • Un solo servidor, implica límite de CPU, memoria y conexiones simultáneas. Cuando el tráfico lo supera, empieza a rechazar pedidos o directamente se cuelga.

TIP

La solución para estos casos no es agregar más hardware para que el servidor sea más potente. El cuello de botella no es la lógica de negocio, es la cantidad de conexiones simultáneas que un solo servidor puede sostener

Lo que proponemos

Dadas las problemáticas detecatadas en la arquitectura actual, proponemos repartir el trabajo del servidor. Aquí es donde entra la utilización de un Load Balancer o balanceador de cargas.

¿Para que sirve un Load Balancer?

Un Load Balancer es un componente que se agrega a sistemas que deben soportar concurrencia y alta disponibilidad, sin depender de un único servidor. Su rol principal es distribuir el tráfico entrante entre varios servidores idénticos: si uno no está disponible, redirige las requests hacia otro que sí lo esté. Todos estos servidores consultan la misma base de datos compartida, ya que son réplicas de la misma aplicación y necesitan trabajar siempre sobre el mismo estado de los datos. El load balancer no solo reparte, sino que además monitorea constantemente si cada servidor está vivo, para saber a cuáles puede mandarles tráfico, a esto se lo llama health check o chequeo de salud.

Arquitectura propuesta

Se agrega un Load Balancer delante de las distintas réplicas de los servidores. Cabe aclarar que las réplicas son stateless (no guardan datos propios). Con esta arquitectura, el sistema soporta el pico de tráfico sin caerse.

flowchart LR

    subgraph arq["Arquitectura Propuesta"]
        direction LR
        roadmap["<b>Users</b><br/>"]
        web["Web de entradas"]
        load-balancer["Load Balancer"]
        servidor_a["Servidor A"]
        servidor_b["Servidor B"]
        servidor_c["Servidor C"]
        db[("Base de datos")]

        roadmap --> web
        web --> load-balancer
        load-balancer --> servidor_a
        load-balancer --> servidor_b
        load-balancer --> servidor_c
        servidor_a --> db
        servidor_b --> db
        servidor_c --> db
    end
    style web fill:#256B2D,stroke:#ADFFB7,color:#fff
    style db fill:#256B2D,stroke:#ADFFB7,color:#fff