FORMACIÓN · AI APPLICATION DEVELOPMENT

Week 22 — AI Engineering at Scale

Hasta ahora hemos aprendido a construir una aplicación AI. Ahora vamos a aprender a construirla para que pueda crecer. ¿Qué ocurre si pasamos de 100 usuarios a 10.000? ¿Y a 100.000? ¿Y a un millón?

Semana 22 de 24 · Nivel avanzado

1. Objetivos de Week 22

La transformación


WEEK 20

¿Es segura?


        ↓


WEEK 21

¿Es un buen producto?


        ↓


WEEK 22

¿Puede soportar crecimiento?


        ↓


WEEK 23

¿Podemos operarla?


        ↓


WEEK 24

¿Podemos convertirnos
en AI Application Engineers?

Al finalizar esta semana deberás ser capaz de:

2. ¿Qué significa escalar?

Escalar significa conseguir que un sistema pueda soportar un aumento de carga sin degradarse de manera inaceptable.

¿Qué es carga?

Puede ser:

Ejemplo


100 usuarios
×
5 acciones / minuto

=

500 acciones / minuto


Ahora:

10.000 usuarios
×
5 acciones / minuto

=

50.000 acciones / minuto

El problema no es solamente que haya más usuarios. También aparecen nuevos cuellos de botella.

Los primeros enemigos de la escalabilidad

  • CPU;
  • memoria;
  • red;
  • base de datos;
  • disco;
  • conexiones;
  • APIs externas;
  • modelos AI;
  • coste;
  • latencia.

3. Vertical vs Horizontal Scaling

Vertical Scaling

Hacemos más potente una máquina.


ANTES

4 CPU
8 GB RAM


        ↓


DESPUÉS

16 CPU
64 GB RAM

Es sencillo, pero tiene límites.

Horizontal Scaling

Añadimos más máquinas.


             USERS
                │
                ▼
        ┌──────────────┐
        │ LOAD BALANCER│
        └───────┬──────┘
                │
       ┌────────┼────────┐
       ▼        ▼        ▼
    SERVER 1 SERVER 2 SERVER 3

Ahora podemos añadir servidores según aumente la demanda.

Idea fundamental:

Para aplicaciones web modernas, el scaling horizontal suele ser mucho más importante que simplemente comprar un servidor más grande.

4. Arquitectura de nuestra Super Aplicación

Nuestra arquitectura inicial podría ser:


                 INTERNET
                     │
                     ▼
                    CDN
                     │
                     ▼
              LOAD BALANCER
                     │
          ┌──────────┼──────────┐
          ▼          ▼          ▼
       APP #1     APP #2     APP #3
          │          │          │
          └──────────┼──────────┘
                     │
          ┌──────────┼───────────┐
          ▼          ▼           ▼
        CACHE     DATABASE      QUEUE
          │          │           │
        Redis     PostgreSQL   Workers
                                  │
                                  ▼
                             AI GATEWAY
                                  │
                     ┌────────────┼───────────┐
                     ▼            ▼           ▼
                  MODEL A      MODEL B     MODEL C

¿Por qué tantas piezas?

Porque cada componente resuelve un problema diferente.

Componente Problema que resuelve
CDN Entrega contenido cerca del usuario.
Load Balancer Distribuye tráfico.
App Servers Procesan requests.
Redis Reduce accesos repetidos.
PostgreSQL Persistencia.
Queue Desacopla tareas.
Workers Procesan trabajos en background.
AI Gateway Centraliza acceso a modelos.

5. Stateless Applications

Una aplicación stateless no depende de la memoria interna de un servidor para mantener el estado del usuario.

Problema


USER
  │
  ▼
SERVER 1

login realizado

session almacenada
solo en SERVER 1


Siguiente request

  │
  ▼

SERVER 2

¿Quién eres?

Tenemos un problema.

Solución


SERVER 1
   │
   ├─────────────┐
   │             │
   ▼             ▼
Redis         Database
   ▲             ▲
   │             │
   └──────┬──────┘
          │
       SERVER 2

El estado se almacena en una capa compartida.

Regla:

Si queremos escalar horizontalmente, evitemos guardar estado crítico solamente en memoria local del servidor.

6. Load Balancing

Un Load Balancer distribuye requests entre múltiples servidores.

Ejemplo


REQUEST 1 → SERVER 1
REQUEST 2 → SERVER 2
REQUEST 3 → SERVER 3
REQUEST 4 → SERVER 1
REQUEST 5 → SERVER 2

Algoritmos

Algoritmo Idea
Round Robin Va rotando servidores.
Least Connections Envía al servidor con menos conexiones.
Weighted Distribuye según capacidad.
IP Hash Relaciona cliente con servidor.

Health Checks

El Load Balancer debe saber si un servidor está vivo.


GET /health

200 OK
{
    "status": "healthy"
}

Si un servidor falla:


SERVER 1 ❌

        ↓

LOAD BALANCER

        ↓

SERVER 2
SERVER 3

7. CDN

Una CDN distribuye contenido geográficamente.

Sin CDN


Madrid
   │
   ▼
Servidor en USA
   │
   ▼
Imagen

Con CDN


Madrid
   │
   ▼
CDN Madrid
   │
   ▼
Imagen

Esto reduce latencia y carga del servidor principal.

¿Qué podemos servir mediante CDN?

No necesitamos montar una CDN desde cero. Servicios como Cloudflare, CloudFront o similares permiten resolver este problema.

8. Caching

Caching significa almacenar temporalmente información para no tener que recalcularla o recuperarla continuamente.

Ejemplo

Nuestra aplicación consulta:


"¿Cuáles son las skills
de todos los empleados?"

Si hacemos la consulta 1.000 veces:


1.000 requests
      ↓
PostgreSQL
      ↓
1.000 queries

Podemos cachear:


REQUEST
  ↓
CACHE
  │
  ├── HIT → devolver resultado
  │
  └── MISS
        ↓
    DATABASE
        ↓
      CACHE
        ↓
     RESULT

Cache Hit

El dato está en cache.

Cache Miss

El dato no está y necesitamos consultar la fuente original.

Problema: invalidación

¿Qué ocurre si cambia el dato en PostgreSQL?

El cache podría tener información antigua.

Uno de los problemas clásicos de sistemas distribuidos:

"¿Cuándo invalido el cache?"

9. Redis

Redis es un sistema de almacenamiento en memoria extremadamente rápido.

Usos habituales

Ejemplo conceptual


SET employee:123
    "Carlos"

GET employee:123

→ Carlos

TTL

Podemos hacer que un dato expire.


employee:123

TTL = 300 segundos

Esto es muy útil para información temporal.

10. Escalabilidad de PostgreSQL

La base de datos suele convertirse en uno de los primeros cuellos de botella.

Problema


10.000 requests

        ↓

10.000 queries

        ↓

PostgreSQL

        ↓

🔥

Primera solución: índices

Si buscamos continuamente:


WHERE employee_id = 12345
necesitamos un índice adecuado.

CREATE INDEX
idx_employee_id
ON employees(employee_id);

Pero cuidado

Los índices aceleran lecturas, pero tienen coste de almacenamiento y escritura.

Segunda solución: evitar SELECT *


❌

SELECT *
FROM employees;


✓

SELECT
    id,
    name,
    main_skill
FROM employees;

Tercera solución: paginación


❌

GET /employees

→ 500.000 empleados


✓

GET /employees?page=1&limit=50

11. Connection Pooling

Abrir una conexión a PostgreSQL tiene un coste.

Mal enfoque


REQUEST
 ↓
crear conexión
 ↓
query
 ↓
cerrar conexión

Si recibimos miles de requests, el coste puede ser enorme.

Connection Pool


         CONNECTION POOL

     ┌─────┬─────┬─────┬─────┐
     │ C1  │ C2  │ C3  │ C4  │
     └─────┴─────┴─────┴─────┘
       ↑     ↑     ↑     ↑
       └─────┴─────┴─────┘
              APP

Las conexiones se reutilizan.

Un error habitual es permitir un número ilimitado de conexiones.

Si tenemos:


20 servidores
×
100 conexiones

=
2.000 conexiones

y PostgreSQL solamente puede manejar una fracción de ellas eficientemente, hemos creado nuestro propio cuello de botella.

12. Queues

Una queue permite desacoplar el momento en que se solicita una tarea del momento en que se ejecuta.

Problema

El usuario sube un PDF de 100 MB y queremos analizarlo con IA.


USER
 ↓
UPLOAD
 ↓
AI ANALYSIS
 ↓
RESULT

Si tarda 60 segundos, la experiencia es mala.

Con Queue


USER
 ↓
UPLOAD
 ↓
QUEUE
 ↓
"Procesando..."
 ↓
WORKER
 ↓
AI
 ↓
DATABASE
 ↓
RESULT

El usuario no necesita permanecer bloqueado durante todo el proceso.

13. Workers

Un worker es un proceso que consume trabajos de una cola y los ejecuta.


                QUEUE
                  │
       ┌──────────┼──────────┐
       ▼          ▼          ▼
    WORKER 1   WORKER 2   WORKER 3
       │          │          │
       ▼          ▼          ▼
      AI         AI         AI

Ventaja

Podemos aumentar el número de workers independientemente del frontend.


100 jobs

2 workers
↓
50 jobs / worker


100 jobs

10 workers
↓
10 jobs / worker

14. Event-Driven Architecture

En una arquitectura tradicional:


A
 ↓
B
 ↓
C
 ↓
D

A depende directamente de B, B de C y C de D.

En un sistema orientado a eventos:


             EVENT BUS
          ↗      ↑      ↖
         /       │       \
       A         B         C

Ejemplo

Cuando se crea un empleado:


EMPLOYEE_CREATED

puede provocar:

El sistema queda desacoplado.

15. AI Gateway

Una de las piezas más importantes de nuestra Super Aplicación.

Problema

Si cada módulo llama directamente a diferentes proveedores:


SEARCH → Provider A

CHAT → Provider B

AGENT → Provider A

CV → Provider C

REPORT → Provider B

acabamos con:

Solución


APPLICATION
     │
     ▼
 AI GATEWAY
     │
     ├── Authentication
     ├── Rate limit
     ├── Logging
     ├── Cost tracking
     ├── Model routing
     ├── Retry
     ├── Fallback
     └── Observability
             │
       ┌─────┼─────┐
       ▼     ▼     ▼
    MODEL A MODEL B MODEL C

El resto de nuestra aplicación no necesita conocer los detalles del proveedor AI.

16. Model Routing

No todas las tareas necesitan el modelo más potente.

Ejemplo

Tarea Modelo Motivo
Clasificación sencilla Small Barato y rápido.
Resumen Medium Buen equilibrio.
Razonamiento complejo Large Mayor capacidad.

Router conceptual


REQUEST
   │
   ▼
AI ROUTER
   │
   ├── simple → SMALL
   │
   ├── medium → MEDIUM
   │
   └── complex → LARGE

Esto puede reducir costes drásticamente.

17. Rate Limiting

Un usuario no debería poder realizar 10.000 requests por segundo.

Ejemplo


USER

máximo:

60 requests / minuto

Si supera el límite:


HTTP 429

Too Many Requests

¿Por qué?

AI es especialmente sensible

Imaginemos que una llamada AI cuesta €0,05.


1 request = €0,05

1.000 requests = €50

1.000.000 requests = €50.000
Un bug puede convertirse en una factura.

18. Procesamiento asíncrono

No todo debe ejecutarse dentro de la petición HTTP.

Síncrono


POST /generate-report

request
  ↓
generate
  ↓
AI
  ↓
PDF
  ↓
response

Asíncrono


POST /generate-report

  ↓

202 Accepted

  ↓

JOB CREATED

  ↓

QUEUE

  ↓

WORKER

  ↓

AI

  ↓

PDF

  ↓

READY

El frontend puede consultar:


GET /jobs/123

{
  "status": "processing"
}

19. Resiliencia

Los sistemas reales fallan.

La pregunta profesional no es:


"¿Cómo evito cualquier fallo?"

sino:


"¿Qué ocurre cuando algo falla?"

Retry

Si una API falla temporalmente:


REQUEST
 ↓
FAIL
 ↓
WAIT
 ↓
RETRY
 ↓
SUCCESS

Exponential Backoff


1ª espera → 1 segundo
2ª espera → 2 segundos
3ª espera → 4 segundos
4ª espera → 8 segundos

¿Por qué no reintentar infinitamente?

Porque podemos amplificar el problema.

Circuit Breaker


NORMAL
  ↓
ERRORS
  ↓
CIRCUIT OPEN
  ↓
NO MORE REQUESTS
  ↓
WAIT
  ↓
TEST
  ↓
CLOSED

Esto evita seguir llamando a un servicio que sabemos que está fallando.

20. Observabilidad

En sistemas pequeños podemos mirar el servidor. En sistemas grandes necesitamos observabilidad.

Las tres grandes señales

Logs

¿Qué ocurrió?

Metrics

¿Cuánto ocurre?

Traces

¿Por dónde pasó una petición?

Ejemplo de trace


REQUEST 1200 ms

 ├── API        50 ms
 │
 ├── PostgreSQL 100 ms
 │
 ├── Redis       5 ms
 │
 └── AI        1045 ms

Ahora sabemos dónde está el cuello de botella.

Métricas fundamentales

21. Control de costes AI

Una aplicación tradicional suele tener costes relativamente previsibles. Una aplicación AI puede tener costes variables.

Ejemplo


Usuarios              100.000

Requests/user/día          20

AI requests/día      2.000.000

Coste/request             €0.01

COSTE DIARIO         €20.000

Eso significa aproximadamente:


€20.000 × 30

=

€600.000 / mes

Antes de lanzar una funcionalidad AI a todos los usuarios debemos conocer su economía.

Estrategias

Cost per user


AI COST / ACTIVE USERS

Cost per successful task


TOTAL AI COST
-------------------------
SUCCESSFUL AI TASKS

22. Backups y Disaster Recovery

Escalar no sirve de nada si perdemos los datos.

Backup

Copia de seguridad de nuestros datos.

RPO

Recovery Point Objective: ¿Cuánto dato podemos permitirnos perder?


RPO = 1 hora

→ como máximo perderíamos
aproximadamente 1 hora de datos.

RTO

Recovery Time Objective: ¿Cuánto tiempo podemos tardar en recuperar el servicio?


RTO = 30 minutos

→ debemos recuperar el sistema
en un máximo aproximado de 30 min.
Significado
RPO Cuánto dato podemos perder.
RTO Cuánto tiempo podemos estar caídos.

23. Load Testing

No debemos esperar a producción para descubrir cuánto soporta nuestra aplicación.

Load test

Simulamos tráfico.


100 users
   ↓
500 users
   ↓
1.000 users
   ↓
5.000 users
   ↓
10.000 users

Preguntas

Herramientas

Algunas opciones:

24. Arquitectura: 100 → 1.000.000 usuarios

Nivel 1 — 100 usuarios


USERS
  ↓
NGINX
  ↓
APP
  ↓
POSTGRESQL
  ↓
AI

No necesitamos Kubernetes, Kafka ni una arquitectura de 50 microservicios.

Principio:

No sobrearquitectar antes de necesitarlo.

Nivel 2 — 10.000 usuarios


             LOAD BALANCER
                    │
             ┌──────┴──────┐
             ▼             ▼
           APP 1         APP 2
             │             │
             └──────┬──────┘
                    ▼
                  REDIS
                    │
                    ▼
               POSTGRESQL
                    │
                    ▼
                  QUEUE
                    │
             ┌──────┴──────┐
             ▼             ▼
          WORKER 1      WORKER 2
                         │
                         ▼
                         AI

Nivel 3 — 100.000 usuarios


                    CDN
                     │
                     ▼
               LOAD BALANCER
                     │
       ┌─────────────┼─────────────┐
       ▼             ▼             ▼
    APP 1          APP 2          APP N
       │             │             │
       └─────────────┼─────────────┘
                     │
             ┌───────┼────────┐
             ▼       ▼        ▼
           REDIS   QUEUE   DATABASE
                     │
             ┌───────┼───────┐
             ▼       ▼       ▼
          WORKER   WORKER   WORKER
                     │
                     ▼
                 AI GATEWAY
                     │
             ┌───────┼───────┐
             ▼       ▼       ▼
           SMALL   MEDIUM   LARGE

Nivel 4 — 1.000.000 usuarios


                         INTERNET
                            │
                            ▼
                           CDN
                            │
                            ▼
                    EDGE / WAF
                            │
                            ▼
                     LOAD BALANCER
                            │
              ┌─────────────┼─────────────┐
              ▼             ▼             ▼
          APP CLUSTER   APP CLUSTER   APP CLUSTER
              │             │             │
              └─────────────┼─────────────┘
                            │
                  ┌─────────┼─────────┐
                  ▼         ▼         ▼
                CACHE     QUEUES    SERVICES
                  │         │         │
                  │         ▼         │
                  │      WORKERS      │
                  │         │         │
                  └─────────┼─────────┘
                            ▼
                       AI GATEWAY
                            │
                ┌───────────┼───────────┐
                ▼           ▼           ▼
             MODEL A     MODEL B     MODEL C
                            │
                            ▼
                      OBSERVABILITY
                            │
                 ┌──────────┼──────────┐
                 ▼          ▼          ▼
               LOGS      METRICS     TRACES

Importante

Estas arquitecturas no son una receta para copiar literalmente. Son modelos mentales. La arquitectura real depende de:

  • tráfico;
  • latencia;
  • presupuesto;
  • equipo;
  • requisitos regulatorios;
  • tipo de datos;
  • criticidad.

25. Herramientas que debes conocer

Herramienta Para qué sirve Nivel
Docker Empaquetar aplicaciones. Imprescindible
NGINX Reverse proxy / web server. Imprescindible
Redis Cache y datos temporales. Muy importante
PostgreSQL Base de datos. Imprescindible
k6 Load testing. Importante
Prometheus Métricas. Avanzado
Grafana Dashboards. Avanzado
OpenTelemetry Traces y observabilidad. Avanzado
Docker Compose Entornos multi-servicio. Imprescindible
Kubernetes Orquestación de contenedores. Avanzado

Docker Compose

Nuestra Super Aplicación podría tener:


services:

  app:
    ...

  postgres:
    ...

  redis:
    ...

  worker:
    ...

  nginx:
    ...

La idea importante

No necesitas memorizar configuraciones. Debes ser capaz de explicar:


"Quiero una aplicación,
una base de datos,
un Redis
y un worker."

Y después utilizar IA para ayudarte a construir la configuración.

26. Utilizar IA como arquitecto

Prompt 1 — Architecture Review


Actúa como un Staff Software Engineer
especializado en sistemas distribuidos.

Esta es la arquitectura de mi aplicación:

[PEGAR ARQUITECTURA]

Actualmente tengo:

- [X] usuarios
- [X] requests/minuto
- [X] AI requests/día
- PostgreSQL
- Redis
- [OTROS]

Analiza:

1. cuellos de botella
2. puntos únicos de fallo
3. problemas de escalabilidad
4. problemas de seguridad
5. problemas de costes
6. problemas de observabilidad

No propongas tecnologías
innecesarias.

Prioriza las mejoras.

Prompt 2 — Capacity Planning


Tengo:

100.000 usuarios

20 requests por usuario/día

30% de requests utilizan IA.

Quiero estimar:

- requests/día
- requests/segundo
- AI requests/día
- capacidad de servidores
- carga de PostgreSQL
- carga de Redis
- jobs de background
- coste potencial de IA

Indica todas las hipótesis
que estás utilizando.

No inventes precios actuales.
Si necesitas precios,
indica qué dato debo proporcionar.

Prompt 3 — Find the Bottleneck


Tengo estos datos:

API latency: 2.1 s
Database: 80 ms
Redis: 5 ms
AI: 1.8 s
CPU: 35%
Memory: 40%

Identifica el cuello de botella.

Explica:

- por qué
- qué NO debería optimizar todavía
- qué optimizarías primero
- cómo lo medirías

Prompt 4 — AI Cost Optimization


Tengo una funcionalidad AI.

Actualmente:

100.000 usuarios
15 requests AI/user/month
coste medio €0.04/request

Analiza el coste mensual.

Después propón
al menos 10 estrategias
para reducirlo.

Clasifícalas:

- arquitectura
- modelo
- prompting
- caching
- producto

No sacrifiques calidad
sin explicarlo.

Prompt 5 — Incident Simulation


Simula un incidente de producción.

Nuestra aplicación tiene:

CDN
Load Balancer
3 servidores
Redis
PostgreSQL
Queue
Workers
AI Gateway

A las 10:00 aumenta el tráfico
10 veces.

Quiero que simules:

10:00
10:05
10:10
10:15
10:30

Para cada momento indica:

- síntomas
- métricas
- componente afectado
- hipótesis
- acción
- consecuencia

Al final crea
un postmortem.

27. Ejercicios prácticos

Ejercicio 1 — Vertical vs Horizontal

Una aplicación está al 95% de CPU. Tenemos dos opciones:

  1. duplicar CPU;
  2. añadir tres servidores.

¿Qué factores analizarías?

Ver respuesta

Primero debemos determinar si la aplicación puede escalar horizontalmente. Si es stateless, añadir servidores suele ser una opción muy interesante. Pero debemos comprobar también si la CPU es realmente el cuello de botella. Podría ser PostgreSQL, una API externa o un proceso bloqueante.

Ejercicio 2 — Cache

Una consulta tarda 300 ms y se ejecuta 50.000 veces al día. ¿Tiene sentido estudiar caching?

Ver respuesta

Sí. Es una consulta muy repetida y potencialmente candidata a caching, siempre que los datos no necesiten ser completamente frescos.

Ejercicio 3 — Queue

Una generación de informe tarda 40 segundos. ¿La ejecutarías directamente en el request HTTP?

Ver respuesta

Probablemente no. Es mejor crear un job y procesarlo asíncronamente. El usuario puede recibir un estado:


202 Accepted

job_id: 123

status: processing

Ejercicio 4 — Workers

Tenemos 10.000 documentos pendientes y un worker procesa 10 documentos por minuto. ¿Cuánto tardaría aproximadamente?

Ver respuesta

10.000 / 10

= 1.000 minutos

≈ 16,7 horas

Si aumentamos a 10 workers:


16,7 / 10
≈ 1,67 horas

Siempre suponiendo que no aparezca otro cuello de botella.

Ejercicio 5 — Rate Limiting

Una API AI cuesta €0,02 por request. Un atacante realiza 500.000 requests. ¿Cuánto podría costar?

Ver respuesta

500.000 × €0,02

= €10.000

Por eso rate limiting y controles de presupuesto son especialmente importantes en AI.

Ejercicio 6 — Model Routing

Tenemos:

  • clasificación simple;
  • resumen;
  • razonamiento complejo.

¿Qué modelo utilizarías?

Ver respuesta

Una estrategia razonable sería:

Clasificación Small
Resumen Medium
Razonamiento Large

Pero deberíamos validarlo con pruebas de calidad.

Ejercicio 7 — RPO/RTO

Una aplicación permite perder como máximo 15 minutos de datos y debe recuperarse en menos de 1 hora. ¿Cuáles son RPO y RTO?

Ver respuesta

RPO = 15 minutos

RTO = 1 hora

Ejercicio 8 — Observabilidad

Una petición tarda 5 segundos. Tenemos:


API       100 ms
Redis      10 ms
Database   90 ms
AI       4.7 s

¿Qué optimizarías primero?

Ver respuesta

La llamada AI. Representa la gran mayoría del tiempo total. Optimizar Redis de 10 ms a 5 ms tendría un impacto mínimo.

Ejercicio 9 — Arquitectura

¿Qué arquitectura elegirías para una aplicación interna con 80 usuarios?

Ver respuesta

Una arquitectura sencilla. Por ejemplo:


NGINX
 ↓
APP
 ↓
POSTGRESQL
 ↓
AI

No tiene sentido introducir 20 microservicios únicamente porque "escala mejor".

Ejercicio 10 — Incidente

La aplicación empieza a devolver HTTP 429. ¿Qué investigarías?

Ver respuesta
  • rate limits;
  • picos de tráfico;
  • abusos;
  • límites del proveedor;
  • reintentos excesivos;
  • configuración del gateway.

Ejercicio 11 — Arquitectura crítica

Un Agent puede eliminar empleados de la base de datos. ¿Lo ejecutarías automáticamente?

Ver respuesta

No sin controles. Una operación destructiva debería tener autorización, validación, auditoría y probablemente aprobación humana.

Ejercicio 12 — Diseño avanzado

Diseña una arquitectura para:

  • 100.000 usuarios;
  • 20 requests/día/usuario;
  • 30% de acciones AI;
  • PostgreSQL;
  • procesamiento de documentos;
  • dashboards;
  • notificaciones.
  • Ver solución orientativa
    
    CDN
     ↓
    WAF
     ↓
    Load Balancer
     ↓
    Stateless App Cluster
     ↓
    Redis
     ↓
    PostgreSQL
     ↓
    Queue
     ↓
    Document Workers
     ↓
    AI Gateway
     ↓
    Model Router
     ↓
    AI Providers
    

    Añadiríamos observabilidad, rate limiting, backups y procesamiento asíncrono.

28. Test autocorregible

30 preguntas · objetivo mínimo: 80%

29. Proyecto Week 22

Construir la arquitectura escalable de la Super Aplicación

Esta semana no consiste simplemente en añadir herramientas. Tenemos que justificar cada decisión.

Fase 1 — Arquitectura actual

Documenta la arquitectura que tenemos en este momento.

Fase 2 — Identificar cuellos de botella

Para cada componente:

Componente Riesgo Métrica Solución
API CPU CPU % Horizontal scaling
PostgreSQL Queries Latency Indexes / pool
Redis Memory Memory % TTL / scaling
AI Coste €/request Routing
Queue Backlog Queue depth Workers

Fase 3 — Crear Docker Compose

El entorno local debería tener, como mínimo:


app
postgres
redis
worker
nginx

Fase 4 — Añadir Queue

Implementa un proceso:


USER
 ↓
CREATE JOB
 ↓
QUEUE
 ↓
WORKER
 ↓
AI
 ↓
DATABASE
 ↓
RESULT

Fase 5 — AI Gateway

Todas las llamadas AI deberán pasar por una capa centralizada.

Fase 6 — Model Router

Define:

Y crea reglas para decidir cuál utilizar.

Fase 7 — Rate Limiting

Implementa límites para:

Fase 8 — Observabilidad

Registra:

Fase 9 — Load Test

Realiza pruebas progresivas:


100 users
 ↓
500
 ↓
1.000
 ↓
5.000
 ↓
10.000

Fase 10 — Simulación de incidente

Provoca uno de estos escenarios:

Documenta:


INCIDENT

Detection
↓
Diagnosis
↓
Mitigation
↓
Recovery
↓
Root Cause
↓
Prevention

Entregables

30. Architecture Decision Records

Una habilidad importante de un ingeniero senior es documentar por qué se tomó una decisión.

Ejemplo ADR


# ADR-001

Título:
Utilizar Redis como cache

Contexto:

La aplicación realiza
consultas repetitivas.

Decisión:

Utilizar Redis.

Alternativas:

- cache local
- PostgreSQL
- Memcached

Consecuencia:

Reducimos latencia y carga
sobre PostgreSQL.

Riesgo:

Datos potencialmente obsoletos.

Mitigación:

TTL + invalidación.

Haz al menos cinco ADR para la Super Aplicación.

31. Reto de nivel Staff Engineer

El tráfico se multiplica por 100 mañana.

A las 09:00 recibes:


1.000 requests/minuto

A las 09:01:


100.000 requests/minuto

No puedes reescribir toda la aplicación.

¿Qué haces?

Tu respuesta debe incluir:

  1. qué monitorizas primero;
  2. qué componente puede fallar;
  3. qué limitas;
  4. qué desactivas temporalmente;
  5. qué escalas;
  6. qué cacheas;
  7. qué procesos pasas a async;
  8. cómo proteges PostgreSQL;
  9. cómo proteges el proveedor AI;
  10. cómo controlas costes;
  11. cómo comunicas el incidente;
  12. cómo recuperas el sistema;
  13. qué cambiarías posteriormente.
Ver una estrategia orientativa

1. Detectar

   Metrics
   Logs
   Alerts


2. Proteger

   Rate limiting
   WAF
   Throttling


3. Reducir carga

   Cache
   Disable expensive features
   Async processing


4. Escalar

   App instances
   Workers


5. Proteger DB

   Connection limits
   Cache
   Read replicas


6. Proteger AI

   Model routing
   Budgets
   Queue


7. Recuperar

   Gradual rollout


8. Postmortem

   Root cause
   Prevention

32. Referencias externas

Docker Documentation
Documentación oficial de Docker.
Docker Compose
Documentación oficial para entornos multi-contenedor.
Redis Documentation
Cache, estructuras de datos, persistencia y operaciones.
PostgreSQL Documentation
Base de datos, índices, performance y administración.
NGINX Documentation
Reverse proxy, load balancing y servidores web.
Kubernetes Documentation
Orquestación y escalabilidad de contenedores.
k6 Documentation
Load testing y performance testing.
Prometheus
Métricas y monitoring.
Grafana
Dashboards y observabilidad.
OpenTelemetry
Observabilidad distribuida, traces, metrics y logs.
Martin Fowler — Microservices
Introducción conceptual a arquitecturas de microservicios.
Patterns of Distributed Systems
Patrones fundamentales para sistemas distribuidos.
Google — Site Reliability Engineering
SRE, disponibilidad, fiabilidad y operación de sistemas.
AWS Architecture Center
Patrones y arquitecturas cloud.
Azure Architecture Center
Patrones de arquitectura y sistemas escalables.

33. Checklist de Week 22

34. Criterios para superar Week 22

Área Nivel esperado
Arquitectura Puede explicar una arquitectura escalable.
Scaling Entiende horizontal y vertical.
Database Identifica cuellos de botella.
Async Puede diseñar queues y workers.
AI Puede diseñar Gateway y Router.
Resiliencia Entiende fallos y recuperación.
Observabilidad Puede definir métricas.
Costes Puede estimar y controlar coste AI.
Testing Puede diseñar load tests.
Proyecto Arquitectura escalable documentada.
Test ≥80%.

35. Preparación para Week 23

Week 23 — Production AI Engineering

Ya sabemos construir. Ya sabemos escalar. Ahora necesitamos aprender a operar una aplicación AI real en producción.

Entraremos en:

  • CI/CD;
  • deployment strategies;
  • blue/green deployments;
  • canary releases;
  • rollback;
  • monitoring;
  • alerting;
  • incident management;
  • SLO;
  • SLI;
  • SLA;
  • error budgets;
  • production debugging;
  • security operations;
  • AI evaluation en producción;
  • model drift;
  • prompt/version management;
  • cost monitoring;
  • AI governance.