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.
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
- HTTP Starter recibe la solicitud.
- Inicia una orquestación Durable.
- La orquestación llama actividades (validar, guardar, notificar, etc.).
- Publica evento a Service Bus para procesamiento asíncrono.
- 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
messageIdpara idempotencia. - Define
dead-letter queuepara 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 SettingsoKey Vault. authLevelcorrecto 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.
