Bienvenido a Platzi

Mario Alexander Vargas Celis

Mario Alexander Vargas Celis

student
hace un año

Arquitectura de APIs escalables en FastAPI implica diseñar y estructurar tu aplicación para manejar un crecimiento en la cantidad de usuarios, datos y peticiones. Aquí tienes una guía práctica para lograrlo:

1. Organización del Proyecto

Organiza tu código en módulos o capas para que sea mantenible y escalable:

  • Routers: Divide tus rutas por funcionalidad en módulos separados (
    users.py
    ,
    products.py
    , etc.) y agrégalas al proyecto principal.
  • Models: Define tus modelos (SQLModel o Pydantic) en archivos específicos.
  • Services: Implementa lógica de negocio en servicios separados.
  • Dependencies: Utiliza dependencias de FastAPI para manejar configuraciones reutilizables (como bases de datos o autenticación).

Ejemplo de estructura:

app/ ├── main.py ├── routers/ │ ├── users.py │ ├── products.py ├── models/ │ ├── user.py │ ├── product.py ├── services/ │ ├── user_service.py │ ├── product_service.py ├── db/ │ ├── database.py │ ├── migrations/

2. Base de Datos

  • ORM Escalable: Utiliza un ORM como SQLModel, SQLAlchemy o Tortoise ORM para manejar bases de datos relacionales.
  • Migraciones: Integra herramientas como
    Alembic
    para gestionar cambios en los esquemas de la base de datos.
  • Conexión eficiente: Configura un pool de conexiones usando
    asyncpg
    o conexiones síncronas bien gestionadas.

3. Rutas y Dependencias

  • Modularización: Usa routers con prefijos y dependencias específicas para cada módulo.
  • Inyección de Dependencias: Utiliza
    Depends
    para manejar configuraciones como bases de datos, autenticación o validación de roles.

Ejemplo:

from fastapi import APIRouter, Depends

router = APIRouter(prefix="/users", tags=["users"])

@router.get("/") async def list_users(): return {"message": "List of users"}

4. Escalabilidad Horizontal

Implementa mecanismos para soportar múltiples instancias de tu API:

  • Uvicorn Workers: Ejecuta varios trabajadores con

    uvicorn
    o
    gunicorn
    .uvicorn app.main:app --host 0.0.0.0 --port 8000 --workers 4

  • Balanceadores de carga: Usa Nginx o servicios como AWS Elastic Load Balancer.

5. Cache

Integra un sistema de cache como Redis para reducir la carga en la base de datos:

  • Resultados de consultas: Guarda respuestas frecuentes.
  • Tokens de autenticación: Usa Redis para almacenar tokens de sesión.

Ejemplo con

aioredis
:

import aioredis

redis = aioredis.from_url("redis://localhost")

6. Middleware

  • Logging: Agrega un middleware para registrar peticiones y respuestas.
  • Autenticación: Implementa autenticación con OAuth2 o JWT.
  • CORS: Configura middleware para habilitar solicitudes desde otros dominios.

Ejemplo:

from fastapi.middleware.cors import CORSMiddleware

app.add_middleware( CORSMiddleware, allow_origins=["*"], allow_credentials=True, allow_methods=["*"], allow_headers=["*"], )

7. Pruebas

Escribe pruebas unitarias y de integración para garantizar la calidad:

  • Pytest: Usa pytest para probar rutas y lógica de negocio.
  • Test de carga: Usa herramientas como Locust o Artillery para simular alto tráfico.

8. Monitoreo y Observabilidad

  • Logs: Usa herramientas como
    Loguru
    o servicios como Datadog.
  • Métricas: Integra Prometheus y Grafana para monitorear el rendimiento.
  • Traza de peticiones: Implementa OpenTelemetry.

9. Escalabilidad en Infraestructura

  • Contenedores: Dockeriza tu aplicación para facilitar la implementación.
  • Orquestación: Usa Kubernetes para gestionar múltiples contenedores.
  • Serverless: Considera AWS Lambda o Google Cloud Functions para servicios específicos.

10. Seguridad

  • Usa HTTPS en todas las solicitudes.
  • Valida y sanitiza datos de entrada.
  • Configura políticas de seguridad en CORS y cabeceras.

Ejemplo Integrado

from fastapi import FastAPI from app.routers import users, products from app.db.database import create_db_and_tables

app = FastAPI()

@app.on_event("startup") def on_startup(): create_db_and_tables()

app.include_router(users.router) app.include_router(products.router)

Con esta arquitectura, tu API en FastAPI estará lista para manejar tanto un desarrollo inicial como un crecimiento significativo.

1 respuestas
    Luis Boivar

    Luis Boivar

    student
    hace 7 meses

    Excelente, esto es lo que buscaba para hacer mas escalables mis micros con fastapi, mil gracias!

Curso de FastAPI

Curso de FastAPI

Crea y conecta APIs modernas con FastAPI y Python. Estructura proyectos, valida datos, organiza modelos, añade autenticación, relaciones y pruebas, y optimiza consultas y rendimiento usando SQLModel y Pydantic.

Curso de FastAPI
Curso de FastAPI

Curso de FastAPI

Crea y conecta APIs modernas con FastAPI y Python. Estructura proyectos, valida datos, organiza modelos, añade autenticación, relaciones y pruebas, y optimiza consultas y rendimiento usando SQLModel y Pydantic.