Consulta de Documentación Microsoft
para NutriSync — Migración Azure
Azure OpenAI — Límite TPM
480K
tokens/min (GPT-4o, tier Standard)
Functions Timeout
10 min
máx. plan Consumo · ilimitado Prem.
Cosmos DB RU/s mín.
400
RU/s por contenedor serverless
Container Apps réplicas
0 → 300
scale-to-zero con KEDA
Azure OpenAI Service — Rate Limits y Cuotas (GPT-4o)
learn.microsoft.com/azure/ai-services/openai/quotas-limits
Resumen oficial: Azure OpenAI aplica límites de velocidad a nivel de deployment, no de cuenta. Para GPT-4o en región East US 2 (recomendada para latencia), el tier Standard ofrece 480K TPM con burst de hasta 60 RPM por defecto. NutriSync puede solicitar incremento de cuota desde el Portal de Azure.
Límites por modelo — GPT-4o (Standard Tier)
| Límite | Valor predeterminado | Máximo solicitado | Impacto NutriSync |
|---|---|---|---|
| Tokens por Minuto (TPM) | 480,000 | 2,000,000 | Suficiente para ~8.000 usuarios activos simultáneos |
| Peticiones por Minuto (RPM) | 60 | 300 | Implementar retry con exponential backoff |
| Tokens por Petición (input) | 128,000 | 128,000 | Contexto largo para historial nutricional |
| Tokens de salida | 4,096 | 16,384 | Planes de menú detallados en una sola llamada |
| Imágenes por petición (vision) | 10 | 10 | Límite fijo — segmentar análisis de fotos de comida |
Error 429 (TooManyRequests): Implementar retry automático con jitter. La documentación oficial recomienda esperar el valor del header
Retry-After antes de reintentar.
Batching de prompts
Agrupar análisis nutricionales similares para maximizar TPM.
Deployment por tier
Separar deployment prod/dev para aislar cuotas.
Provisioned Throughput
Para >100K usuarios, evaluar PTU (tarifa fija, sin límite RPM).
Monitor con Azure Monitor
Alertas en TokensRemaining < 20% para escalar proactivamente.
Azure Functions Python v2 — Programming Model
learn.microsoft.com/azure/azure-functions/functions-reference-python
Resumen oficial: El modelo de programación Python v2 (GA desde nov. 2023) usa decoradores en lugar de
function.json. NutriSync puede definir triggers HTTP, colas y timers directamente en el código, eliminando archivos de configuración adicionales.
Python 3.11 — Azure Functions v2
Copiar
# function_app.py — Pipeline de procesamiento de menús NutriSync import azure.functions as func import json from datetime import datetime app = func.FunctionApp(http_auth_level=func.AuthLevel.FUNCTION) @app.route(route="procesar-menu", methods=["POST"]) async def procesar_menu(req: func.HttpRequest) -> func.HttpResponse: """Analiza macros y genera plan semanal para empresa.""" body = req.get_json() empresa_id = body.get("empresa_id") empleados = body.get("empleados", []) resultado = await generar_plan_nutricional(empresa_id, empleados) return func.HttpResponse( json.dumps(resultado, ensure_ascii=False), mimetype="application/json", status_code=200 ) @app.timer_trigger(schedule="0 8 * * 1") # Lunes 8:00 async def enviar_menus_semanales(myTimer: func.TimerRequest) -> None: """Distribuye menús semanales a todos los clientes activos.""" empresas = await obtener_empresas_activas() for empresa in empresas: await distribuir_menu(empresa) @app.queue_trigger(arg_name="msg", queue_name="analisis-fotos", connection="AzureWebJobsStorage") async def analizar_foto_comida(msg: func.QueueMessage) -> None: """Procesa foto de comida con GPT-4o Vision asíncronamente.""" payload = json.loads(msg.get_body().decode("utf-8")) await analizar_con_openai_vision(payload["foto_url"], payload["user_id"])
Comparativa de planes para NutriSync
| Plan | Timeout | Escalado | Coste | Recomendado |
|---|---|---|---|---|
| Consumo | 10 min | Automático | Pay-per-use | Análisis síncronos cortos |
| Premium (EP1) | 60 min | Pre-warmed | ~€0.17/hora | Pipeline menús (recomendado) |
| Dedicated (App Service) | Ilimitado | Manual/auto | Fijo mensual | Solo si > 1M invocaciones/mes |
Nota oficial: Python v2 requiere
AzureFunctionsJobHost__extensions__durableTask__hubName en Durable Functions. Para el pipeline de NutriSync, usar el patrón Fan-out/Fan-in para procesar múltiples empresas en paralelo.Cosmos DB NoSQL — Diseño de Partition Keys
learn.microsoft.com/azure/cosmos-db/partitioning-overview
Resumen oficial: La partition key es la decisión de diseño más importante en Cosmos DB. Una clave correcta distribuye uniformemente la carga y evita "hot partitions". Para NutriSync (SaaS multi-tenant), la documentación Microsoft recomienda /empresa_id como clave de partición principal con hierarchical partition keys para subdividir por
/empresa_id/usuario_id.
Análisis de candidatos — Partition Key NutriSync
| Candidato | Cardinalidad | Hot Partition | Cross-partition | Veredicto |
|---|---|---|---|---|
/usuario_id |
Alta (100K+) | Mínimo | Frecuente (queries empresa) | ❌ No recomendado |
/empresa_id |
Media (500+) | Riesgo empresas grandes | Bajo | ⚠️ Válido para <10K emp/tenant |
/empresa_id + /usuario_id |
Muy alta | Distribuido | Mínimo | ✅ RECOMENDADO (hierarchical) |
/fecha_menu |
Baja (365) | Extremo (writes diarios) | Frecuente | ❌ Anti-pattern |
JSON — Modelo de documento NutriSync en Cosmos DB
Copiar
{
"id": "perfil_u_7829",
"empresa_id": "nutrisync_acme_corp", // PK nivel 1
"usuario_id": "u_7829", // PK nivel 2 (hierarchical)
"nombre": "María García",
"restricciones": ["gluten", "lactosa"],
"objetivo_kcal": 1800,
"plan_activo": {
"semana": "2026-W25",
"menus": ["lunes", "martes", "miércoles"]
},
"_ts": 1750072800
}
Hierarchical Partition Keys
Hasta 3 niveles: empresa → departamento → usuario.
RU/s Autoscale
Configurar 400–4000 RU/s para adaptarse a picos.
Composite Indexes
Índice en (empresa_id, fecha) para queries de menú.
TTL para histórico
Expirar menús >90 días automáticamente. 0 coste adicional.
Azure Container Apps — Escalado con KEDA
learn.microsoft.com/azure/container-apps/scale-app
Resumen oficial: Azure Container Apps integra KEDA (Kubernetes Event-Driven Autoscaling) de forma nativa. Las apps pueden escalar a 0 réplicas y volver a escalar en segundos ante eventos de colas, métricas HTTP o Cron. Para NutriSync, KEDA permite escalar el servicio de análisis nutricional solo cuando hay trabajo pendiente.
YAML — Scale Rule KEDA para NutriSync (Azure Queue + HTTP)
Copiar
scale: minReplicas: 0 # Scale-to-zero fuera de horario maxReplicas: 50 # Máx. durante hora punta (12:00–14:00) rules: - name: cola-analisis-menus custom: type: azure-queue metadata: queueName: analisis-fotos queueLength: "10" # 1 réplica cada 10 msgs accountName: nutrisyncsa auth: - secretRef: azure-storage-connection triggerParameter: connection - name: http-api-principal http: metadata: concurrentRequests: "100" # 1 réplica por 100 req/seg
Límites y consideraciones de Container Apps
| Parámetro | Valor | Nota |
|---|---|---|
| Réplicas máximas por app | 300 | Suficiente para NutriSync en pico |
| CPU mín. por réplica | 0.25 vCPU | Ajustar a 1 vCPU para análisis IA |
| Memoria mín. por réplica | 0.5 Gi | Recomendado 2 Gi para modelos |
| Tiempo de cold start | ~5–15 seg | Menor que AKS, mayor que Functions |
| Scale-to-zero disponible | Sí (nativo) | Ahorro ~70% en horas valle |
Arquitectura recomendada para NutriSync: API HTTP en Container Apps (0–50 réplicas) + Azure Functions Premium para pipeline de menús (timeout 60 min) + Cosmos DB con hierarchical partition keys. Coste estimado con 5.000 usuarios: ~€280/mes.