Mario Alexander Vargas Celis
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, etc.) y agrégalas al proyecto principal.products.py - 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 para gestionar cambios en los esquemas de la base de datos.
Alembic - Conexión eficiente: Configura un pool de conexiones usando o conexiones síncronas bien gestionadas.
asyncpg
3. Rutas y Dependencias
- Modularización: Usa routers con prefijos y dependencias específicas para cada módulo.
- Inyección de Dependencias: Utiliza para manejar configuraciones como bases de datos, autenticación o validación de roles.
Depends
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
ouvicorn.uvicorn app.main:app --host 0.0.0.0 --port 8000 --workers 4gunicorn -
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
aioredisimport 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 o servicios como Datadog.
Loguru - 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.
Luis Boivar
Excelente, esto es lo que buscaba para hacer mas escalables mis micros con fastapi, mil gracias!
