AprendiTech
← Todos los artículos

2026-04-19

Azure Functions avanzado: Durable Functions, colas y observabilidad end-to-end

Segunda parte práctica: diseña flujos robustos con Durable Functions, Service Bus y monitoreo en Application Insights para entornos reales.

Azure Functions avanzado: Durable Functions, colas y observabilidad end-to-end

En la primera parte vimos cómo crear una Azure Function HTTP para resolver un caso real.

Ahora vamos al siguiente nivel: procesos largos, integración con colas y observabilidad completa para producción.

Objetivo de esta segunda parte

Construir una arquitectura que permita:

  • Recibir solicitudes por HTTP.
  • Ejecutar un flujo orquestado de varios pasos.
  • Reintentar automáticamente cuando haya fallos temporales.
  • Monitorear todo el recorrido del proceso.

¿Cuándo usar Durable Functions?

Usa Durable Functions cuando tu proceso:

  • Tiene varios pasos dependientes.
  • Debe esperar respuestas externas.
  • Puede tardar más que una petición HTTP tradicional.
  • Requiere reintentos y trazabilidad de estado.

Patrón recomendado

  1. HTTP Starter recibe la solicitud.
  2. Inicia una orquestación Durable.
  3. La orquestación llama actividades (validar, guardar, notificar, etc.).
  4. Publica evento a Service Bus para procesamiento asíncrono.
  5. Registra telemetría en Application Insights.

Ejemplo base de orquestador

import azure.durable_functions as df

def orchestrator_function(context: df.DurableOrchestrationContext):
    input_data = context.get_input()

    validated = yield context.call_activity("validarSolicitud", input_data)

    retry_options = df.RetryOptions(first_retry_interval_in_milliseconds=5000, max_number_of_attempts=3)
    retry_options.backoff_coefficient = 2

    saved = yield context.call_activity_with_retry("guardarRegistro", retry_options, validated)

    yield context.call_activity("enviarServiceBus", {
        "id": saved["id"],
        "email": saved["email"],
        "tipo": "confirmacion"
    })

    return {"ok": True, "id": saved["id"]}

main = df.Orchestrator.create(orchestrator_function)

Actividades desacopladas

Separa responsabilidades en actividades pequeñas:

  • validarSolicitud: reglas de entrada y saneamiento.
  • guardarRegistro: persistencia en base de datos.
  • enviarServiceBus: publicar evento para procesos posteriores.
  • notificarCliente: email o WhatsApp (opcional asíncrono).

Este diseño hace que el flujo sea más mantenible y testeable.

Integración con Azure Service Bus

Service Bus te ayuda a desacoplar procesos:

  • La API responde rápido.
  • Los procesos pesados se ejecutan en segundo plano.
  • Puedes manejar picos de carga con mayor estabilidad.

Buenas prácticas:

  • Usa messageId para idempotencia.
  • Define dead-letter queue para mensajes fallidos.
  • Configura reintentos y TTL según criticidad del proceso.

Observabilidad con Application Insights

Para operar en producción necesitas visibilidad real.

Configura y monitorea:

  • Requests: latencia por endpoint.
  • Dependencies: llamadas a DB, Service Bus, APIs externas.
  • Exceptions: errores agrupados por tipo.
  • Custom Events: hitos del negocio (ej. LeadProcesado).

Ejemplo de log estructurado en actividad:

import logging

logging.info(
    "Lead procesado",
    extra={
        "leadId": input_data["id"],
        "canal": "web",
        "etapa": "guardarRegistro"
    }
)

Métricas mínimas que deberías medir

  • Tiempo promedio de orquestación.
  • Tasa de fallos por actividad.
  • Retries ejecutados por día.
  • Mensajes en cola y en dead-letter.
  • Tiempo total desde solicitud hasta resultado final.

Seguridad y gobernanza

Antes de pasar a producción:

  • Secretos en Application Settings o Key Vault.
  • authLevel correcto en triggers HTTP.
  • Validación estricta de payloads.
  • Control de concurrencia y límites por ambiente.
  • Alertas automáticas en Application Insights.

Checklist de producción

  • Reintentos configurados en actividades críticas.
  • DLQ monitoreada y con proceso de reproceso.
  • Dashboards de operación activos.
  • Alertas por error y por latencia alta.
  • Logs con contexto de negocio (ID de proceso, cliente, etapa).

Conclusión

Con Durable Functions + Service Bus + Application Insights, pasas de una automatización básica a una solución empresarial robusta.

La clave es diseñar flujos desacoplados, medibles y resilientes desde el inicio.