Microsoft
Microsoft Learn — Documentación Oficial
Skill: documentacion-microsoft · 4 queries ejecutadas · 18 artículos revisados · Fuente: learn.microsoft.com
Queries ejecutadas (microsoft_docs_search)
🔍 "Azure OpenAI GPT-4o rate limits quotas"
🔍 "Azure Functions Python v2 programming model quickstart"
🔍 "Cosmos DB partition key design best practices"
🔍 "Container Apps scaling rules KEDA tutorial"
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

PlanTimeoutEscaladoCosteRecomendado
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

CandidatoCardinalidadHot PartitionCross-partitionVeredicto
/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ámetroValorNota
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.